简单记录下如何构建docker 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"]
EXECFORMCMD ["params1","param2"]
, 作为ENTRYPOINT的默认参数CMD command param1 param2
SHELLFORM
ENTRYPOINT
ENTRYPOINT
能够使容器以可执行的形式运行,只有最后出现的ENTRYPOINT
才会有效。使用docker run --entrypoint
可以指定覆盖
ENTRYPOINT ["executable","param1","param2"]
EXECFORMENTRYPOINT 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来源
I don’t want to survive. I want to live. - Ryan Stone