如何使用Dockerfile构建Docker镜像
Build Docker Image
简单记录下如何构建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 OpenJDK8ENV 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 && \
#建立目录/optapk --update add --virtual build-dependencies curl && \
#添加curl命令到虚拟构建依赖组build-dependenciescurl -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 .