使用Dockerfile构建Docker镜像 | 8lovelife's life
0%

使用Dockerfile构建Docker镜像

简单记录下如何构建docker image

Docker Build Usage

  1. dcoker build 命令将构建用到的内容发送给docker daemon,依次执行Dockerfile中的命令(每执行一行指令将会提交a new layer),执行成功image构建完成
  2. 构建docker image时,应该选择一个属于构建相关的目录(构建镜像所需内容),将会减少不必要的内容到docker daemon的传输从而加速构建
  3. 指定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","param2"] , 作为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来源

I don’t want to survive. I want to live. - Ryan Stone

Gravity