Dockerfile详解
admin
2023-02-26 06:40:51
0次

制作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可以覆盖掉默认的参数

相关内容

热门资讯

空调连续工作多久需要停机休息 空调连续工作的时间取决于多个因素,包括空调的型号、功率、使用环境和维护情况等。一般来说,空调可以连续...
空调哪个符号是除湿的 空调除湿功能通常用一个水滴形状的符号表示。不同品牌和型号的空调遥控器可能会有所差异,但一般来说,除湿...
格力空调多长时间加一次氟利昂 1、一般情况下,空调对氟利昂的使用量是非常小的,所以在空调使用了四年左右的时候再考虑加也没问题。2、...
空调用多长时间需要加氟一次 一般情况下是五年。当出现以下这几种情况时,空调才需要加氟。1、空调的室内机和室外机各有两个接口,当接...
格调生活·C标思享荟:卡萨帝在... 9月12日的郑州龙湖金融岛,夜风轻拂,灯光璀璨。“C标时刻共传奇——卡萨帝思享荟暨20周年品牌盛典郑...
品牌价值破千亿、高端份额持续领... 9月12日,“C标时刻共传奇——卡萨帝思享荟暨20周年品牌盛典郑州站”在郑州龙湖金融岛举办。2026...
空调主板坏了修800还是换新的 空调主板坏了是修还是换新,需要考虑多个因素,以下是一些建议:1. 维修成本:如果维修费用较低,比如 ...
空调开多久需要休息多长时间 问题:空调开多久需要休息多长时间回答:1、在使用空调的过程中,一般空调开7~8个小时左右需要休息2~...
中央空调多长时间清洗一次 1、一般空调开机前清洗一次即可,空调开机中间时段再清洗一次,空调关机时清洗一次,这样比较合理。2、空...
中央空调氟利昂多久加一次 看空调制热和制冷程度,很多人的观点认为氟利昂必须一年放一次,其实这个观点是错误的,理解上面有点偏差,...