Dockerfile详解

制作Docker image有两种方式: 一是使用Docker container(docker save container_name -o test.tar ) ,再导出image,而是使用Dockerfile, 将所有动作导入到文件中,使用build命令制作成镜像。
一,Dockerfile基本结构
一般的Dockerfile分为四个部分:基础镜像信息,维护者信息,镜像操作指令和容器启动时的指令
FROM nginx:1.13.5-alpine MAINTAINER SXY Team #设置时区 RUN echo 'Asia/Shanghai' >/etc/timezone ARG SIBE_VERSION=0 COPY images/files/entrypoint.sh /usr/local/bin/ RUN chmod u+x /usr/local/bin/entrypoint.sh # Update to get support for Zip/Unzip, Bash RUN apk --update add zip unzip bash wget ENV WWW_TARGET /var/www/html/ COPY images/files/mysite.template /etc/nginx/conf.d/default.conf ADD dist/ /tmp/ RUN mkdir -p ${WWW_TARGET} \ && mv /tmp/ ${WWW_TARGET} \ && rm -rf /tmp/ ENV MGMT_API_URL http://192.168.3.223:19980 ENV MGMT_API_AUTHORIZATION d2ViX2FwcDpjaGFuZ2VpdA== RUN cp /var/www/html/scripts/http/configuration.json /var/www/html/scripts/http/configuration.json.template RUN cp /var/www/html/scripts/http/configuration.json /var/www/html/scripts/http/configuration.json.template2 # forward request and error logs to docker log collector RUN mkdir -p /var/log/webui && ln -sf /dev/stdout /var/log/webui/access.log \ && ln -sf /dev/stderr /var/log/webui/error.log EXPOSE 80 443 ENTRYPOINT ["/usr/local/bin/entrypoint.sh"] CMD ["nginx", "-g", "daemon off;"] entrypoint中的信息 [root@test-227 files]# cat entrypoint.sh #!/bin/bash setup() { echo "Configure 1 management api url to ${MGMT_API_URL}" cat /var/www/html/scripts/http/configuration.json.template | \ sed "s#http://192.168.3.223:19980#${MGMT_API_URL}#g" > /var/www/html/scripts/http/configuration.json.template2 cat /var/www/html/scripts/http/configuration.json.template2 echo "Configure 2 AUTHORIZATION to ${MGMT_API_AUTHORIZATION}" cat /var/www/html/scripts/http/configuration.json.template2 | \ sed "s#d2ViX2FwcDpjaGFuZ2VpdA==#${MGMT_API_AUTHORIZATION}#g" > /var/www/html/scripts/http/configuration.json cat /var/www/html/scripts/http/configuration.json } setup exec "$@"
FROM:指定基础镜像,要在哪个镜像建立
FROM 或者 FROM :
第一条指令必须为FROM指令

站在用户的角度思考问题,与客户深入沟通,找到全南网站设计与全南网站推广的解决方案,凭借多年的经验,让设计与互联网技术结合,创造个性化、用户体验好的作品,建站类型包括:成都网站制作、成都网站建设、外贸营销网站建设、企业官网、英文网站、手机端网站、网站推广、域名注册网站空间、企业邮箱。业务覆盖全南地区。

MAINTAINER: 指定维护者信息
MAINTAINER

RUN: 在镜像中要执行的命令
RUN 或者 RUN ["executable","param1","param2"]
前者将shell终端中运行命令,即/bin/bash -c;后者则使用exec执行,指定使用其他终端可以通过第二种方式实现,例如RUN ["/bin/bash", "-c", "echo hello"]

WORKDIR: 指定当前工作目录,相当于cd
WORKDIR /path/to/workdir
为后续的RUN,CMD,ENTRYPOINT指令配置工作目录,可以使用多个WORKDIR指令,后续命令如果参数是相对路径,则会基于之前命令指定的路径,例如
WORKDIR /a
WORKDIR b
WORKDIR c
RUN pwd
则最终的路径/a/b/c

EXPOSE:指定容器需要被打开的端口
EXPOSE 80
告诉docker服务容器需要暴露的端口,但是目前只在容器中暴露,如果想要在节点进行暴露则需要-p 80:80,或者-P(主机将为其暴露一个随机端口)

ENV: 定义环境变量
ENV
指定一个环境变量在容器中生成
ENV managementapi http://192.168.3.226

COPY: 复制本地dockerfile路径根目录下的文件到容器文件中
COPY

ADD: 相当于COPY,但比COPY功能强大
ADD
此命令也是将主机任何地方文件到容器文件中,但是可以复制tar文件时,也会自动展开

VOLUME: 挂载目录
VOLUME ["/data"]
创建一个可以从本地主机或者其他容器的挂载点,一般用来存放数据

USER:
USER daemon
指定运行容器时的用户名或UID,后续的RUN也会使用指定用户。当服务不需要管理员权限时,可以通过该命令指定运行用户,并且可以在之前创建需要的用户 RUN useradd -s /sbin/nologin -M www。

ENTRYPOINT
两种格式:
ENTRYPOINT ["executable","param1","param2"]
ENTRYPOINT command param1 param2 (shell)
配置容器启动后执行的命令,并且不可被docker run参数覆盖,每个Dockerfile中只能有一个ENTRYPOINT,当指定多个时,只有最后一个生效

CMD:
支持三种格式
CMD ["executable","param1","param2"] 使用exec执行
CMD command1 command2 command3 在/bin/bash中执行,提供给需要交互应用
CMD ["param1","param2"] 提供给 ENTRYPOINT 的默认参数;
指定启动容器时执行的命令,每个Dockerfile只能有一条CMD命令。如果指定了多条命令,只有最后一条会被执行,则会覆盖掉CMD指定命令

ENTRYPOINT和CMD的区别: ENTRYPOINT指定了该镜像启动时入口,CMD则指定了容器启动时的命令,当两者共用时,完整的启动命令像是ENTRYPOINT+CMD,使用ENTRYPOINT的好处是在我们启动镜像就像是启动了一个可执行程序,在CMD上仅需要指定参数;另外在我们自定义CMD时不容易出错

使用CMD的Dockerfile:
FROM MySQL
CMD ["echo","test"]

使用ENTRYPOINT的Dockerfile
FROM mysql
ENTRYPOINT ["echo","test"]

ENTRYPOINT不能覆盖掉执行时的参数,会把启动镜像是的命令当参数,而CMD可以覆盖掉默认的参数


当前标题:Dockerfile详解
文章网址:http://ybzwz.com/article/jjcijg.html