如何使用Dockerfile构建Docker镜像
2017-09-25 00:10
1021 查看
Build Docker Image
简单记录下如何构建docker imageBuild 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 param2SHELLFORM
ENTRYPOINT
ENTRYPOINT能够使容器以可执行的形式运行,只有最后出现的
ENTRYPOINT才会有效。使用
docker run --entrypoint可以指定覆盖
ENTRYPOINT ["executable","param1","param2"]EXECFORM
ENTRYPOINT command param1 param2SHELLFORM,将不会使用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.6activemq Dockerfile来源
相关文章推荐
- Docker学习笔记-- 如何使用Dockerfile构建镜像
- Docker如何使用Dockerfile构建镜像
- Docker-- 如何使用Dockerfile构建镜像
- 如何使用Dockerfile构建镜像
- Docker学习笔记(3)-- 如何使用Dockerfile构建镜像
- 如何使用Dockerfile构建镜像
- Docker学习笔记(3)-- 如何使用Dockerfile构建镜像
- Docker学习笔记-- 如何使用Dockerfile构建镜像
- 如何使用Dockerfile构建镜像
- 如何使用Dockerfile构建镜像
- Docker学习笔记(3)-- 如何使用Dockerfile构建镜像
- Docker学习笔记(3)-- 如何使用Dockerfile构建镜像
- 如何使用Dockerfile构建镜像
- 如何使用Dockerfile构建镜像
- 如何使用Dockerfile构建镜像
- Docker学习笔记(3)-- 如何使用Dockerfile构建镜像
- 如何使用Dockerfile构建镜像
- Docker学习笔记(3)-- 如何使用Dockerfile构建镜像
- 使用dockerfile构建镜像
- Docker学习6 - 使用Dockerfile构建镜像