您的位置:首页 > 运维架构 > Docker

如何使用Dockerfile构建Docker镜像

2017-09-25 00:10 1021 查看

Build Docker Image

简单记录下如何构建docker image

Build Docker Image
Docker Build Usage

Dockerfile中相关指令
RUN

CMD

ENTRYPOINT

SHELL

CMD ENTRYPOINT

构建activemq image

参考

Docker Build Usage

dcoker build
命令将构建用到的内容发送给docker daemon,依次执行Dockerfile中的命令(每执行一行指令将会提交a new layer),执行成功image构建完成

构建docker image时,应该选择一个属于构建相关的目录(构建镜像所需内容),将会减少不必要的内容到docker daemon的传输从而加速构建

指定Dockerfile构建,
docker build -t 8lovelife/activemq:1.0 -f /home/dmz/temp/Dockerfile .


Dockerfile中相关指令

RUN

RUN
用于在当前镜像之上a new layer执行所需命令,执行后结果将被提交并可被后续指令使用

SHELLFORM:
RUN <COMMAND>
,linux 中默认以
/bin/sh -c
执行,windows默认为
cmd /s /c


EXECFORM:
RUN ["executable","param1","parma2"]
,这种形式并不会执行命令shell。如
RUN ["echo","$DMZ"]
并不会输出解析后的变量DMZ,而
RUN ["sh","-c","echo $DMZ"]
可以解析变量DMZ(最终镜像中的系统变量)

EXECFORM将以JSON Array形式解析,所以参数需要双引号且相关符号需要转译如反斜杠,如:
RUN ["C:\\windows\\system32"]


CMD

CMD
用于容器执行的默认行为(同样能够使容器以可执行的形式运行),非必须存在。若在Dockerfile出现多次,只有最后一次会有效

CMD ["executable","param1","param2"]
EXECFORM

CMD ["params1","para
4000
m2"]
, 作为ENTRYPOINT的默认参数

CMD command param1 param2
SHELLFORM

ENTRYPOINT

ENTRYPOINT
能够使容器以可执行的形式运行,只有最后出现的
ENTRYPOINT
才会有效。使用
docker run --entrypoint
可以指定覆盖

ENTRYPOINT ["executable","param1","param2"]
EXECFORM

ENTRYPOINT command param1 param2
SHELLFORM,将不会使用CMD中的参数。这会成为/bin/sh -c的子命令,可执行命令不再是容器中的PID=1,这将导致容器无法无法接收Unix signals并且无法听从
docker stop <container>
SIGTERM,当stop 容器超时后,SIGKILL会被发出强制停止容器。使用
exec
能够解决问题。

SHELL

SHELL
用于更改SHELLFORM中默认使用的shell,如windows使用powershell,
SHELL ["powershell", "-command"]
,多次SHELL指令将会覆盖之前的SHELL指令

CMD / ENTRYPOINT



构建activemq image

Dockerfile

FROM openjdk:8-jre-alpine
#Base Image OpenJDK8

ENV ACTIVEMQ_VERSION 5.14.5
#环境变量

ENV ACTIVEMQ apache-activemq-$ACTIVEMQ_VERSION


ENV ACTIVEMQ_TCP=61616 ACTIVEMQ_AMQP=5672 ACTIVEMQ_STOMP=61613 ACTIVEMQ_MQTT=1883 ACTIVEMQ_WS=61614 ACTIVEMQ_UI=8161


ENV ACTIVEMQ_HOME /opt/activemq


RUN set -x && \
#设置脚本执行跟踪

mkdir -p /opt && \
#建立目录/opt

apk --update add --virtual build-dependencies curl && \
#添加curl命令到虚拟构建依赖组build-dependencies

curl -s -S https://archive.apache.org/dist/activemq/$ACTIVEMQ_VERSION/$ACTIVEMQ-bin.tar.gz | tar xvz -C /opt && \
#下载activemq并解压到指定目录

ln -s /opt/$ACTIVEMQ $ACTIVEMQ_HOME && \
#建立软连接

addgroup -S activemq && adduser -S -H -G activemq -h $ACTIVEMQ_HOME activemq && \
#添加用户&用户组

chown -R activemq:activemq /opt/$ACTIVEMQ && \

chown -h activemq:activemq $ACTIVEMQ_HOME && \

apk del build-dependencies && \
#删除虚拟构建依赖组

rm -rf /var/cache/apk/*
#删除install缓存,缩小image size ,反斜杠换行(同一条命令执行减少结果提交,减少image layer)

USER activemq
#用户切换(之后命令所属用户

WORKDIR $ACTIVEMQ_HOME


EXPOSE $ACTIVEMQ_TCP $ACTIVEMQ_AMQP $ACTIVEMQ_STOMP $ACTIVEMQ_MQTT $ACTIVEMQ_WS $ACTIVEMQ_UI
#暴露端口号

CMD ["/bin/sh", "-c", "bin/activemq console"]
#容器启动后执行命令

构建

docker build -t 8lovelife/activemq:1.0 .


参考

Docker v17.6

activemq Dockerfile来源
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  Dockerfile Docker activemq