千家信息网

Docker系列10:docker file指令详解(2)

发表于:2025-12-03 作者:千家信息网编辑
千家信息网最后更新 2025年12月03日,10、指令10:RUN指令RUM命令是基于Dockerfile构建镜像的时候要运行的命令比如基于url的方式获取nginx安装包:获取到gz包以后需要使用RUN指令来运行tar来解压展开这个nginx
千家信息网最后更新 2025年12月03日Docker系列10:docker file指令详解(2)

10、指令10:RUN指令

  • RUM命令是基于Dockerfile构建镜像的时候要运行的命令

  • 比如基于url的方式获取nginx安装包:获取到gz包以后需要使用RUN指令来运行tar来解压展开这个nginx的包了。

案例:编写docker file,并制作镜像

#my first docker fileFROM busybox:latestMAINTAINER "zxhk <237745635@qq.com>"ENV DOC_ROOT=/data/ \    WORK_DIR=/var/usr/src/ \    REPO_DIR=/etc/yum.repos.d/ \    MYSQL_DIR=/data/mysql/    COPY index.html ${DOC_ROOT:-/var/www/html/}COPY yum.repos.d $REPO_DIRWORKDIR $WORK_DIRADD http://nginx.org/download/nginx-1.17.6.tar.gz ./RUN cd ${WORK_DIR} && tar -xf nginx-1.17.6.tar.gz && mv nginx-1.17.6 nginxVOLUME $MYSQL_DIREXPOSE 80/tcp 53/udp
[root@host1 img1]# docker build -t miniser:v1-8 ./

基于镜像启动一个容器,检测是否已经解压

[root@host1 img1]# docker run --rm --name t1 miniser:v1-8 ls /var/usr/src/nginxnginx-1.17.6.tar.gz

11、指令11:CMD指令

  • CMD是定义一个镜像文件启动为容器的时候,默认要运行的程序,也就是那个pid为1的程序

  • CMD可以有多个,但是只有最后一个才是生效的。

CMD指令有三种格式

格式1:CMD <命令>

  • 这种格式的话,会自动的将这个命令运行为shell的子进程,这样的好处就是在这个命令中可以有各种的特殊的符号,但是缺点就得是这个命令的进程号不是 1

  • 也可以借助于exec,让这个进程的ID成为1

格式2:CMD ["<命令>", "<参数1>","<参数2>"]

  • 这种格式的话是直接将这个进程启动为ID为1的进程

格式3:CMD ["<参数1>","<参数2>"]

  • 这种格式需要借助于ENTRYPOINT才能运行

案例1:使用格式1让容器运行的时候,自动运行apache

第一步:创建dockerfile

FROM busyboxLABEL maintainer="zxhk<237745635@qq.com>"ENV DOC_ROOT="/var/www/html/"RUN mkdir -p ${DOC_ROOT} && \    echo "

test

">${DOC_ROOT}index.htmlCMD /bin/httpd -f -h ${DOC_ROOT}

第二步:制作镜像

[root@host1 img2]# docker build -t miniser:v2-1 ./

第三步:查看镜像的详细信息

[root@host1 img2]# docker inspect miniser:v2-1 -f '{{.ContainerConfig.Cmd}}'[/bin/sh -c #(nop)  CMD ["/bin/sh" "-c" "/bin/httpd -f -h ${DOC_ROOT}"]]

第四步:创建容器

[root@host1 img2]# docker run --name t1 --rm -d miniser:v2-1

第五步:登录容器,查看容器信息

[root@host1 img2]# docker exec -it t1 /bin/sh/ # / # netstat -anActive Internet connections (servers and established)Proto Recv-Q Send-Q Local Address           Foreign Address         State       tcp        0      0 :::80                   :::*                    LISTEN      / # / # psPID   USER     TIME  COMMAND    1 root      0:00 /bin/httpd -f -h /var/www/html/   10 root      0:00 /bin/sh   15 root      0:00 ps/ #

案例2:使用格式2让容器运行的时候,自动运行apache

FROM busyboxLABEL maintainer="zxhk<237745635@qq.com>"ENV DOC_ROOT="/var/www/html/"RUN mkdir -p ${DOC_ROOT} && \    echo "

test

">${DOC_ROOT}index.htmlCMD ["/bin/sh", "-c", "/bin/httpd", "-f", "-h", "${DOC_ROOT}"]

11、指令11:ENTRYPOINT指令

  • ENTRYPOINT的功能就是和CMD类似的,用于指定容器启动后要默认运行的程序

  • 在启动容器的时候,run后面指定的命令,可以覆盖镜像中的CMD命令

  • ENTRYPOINT所运行的命令不会不被docker run所指定的命令覆盖

案例:用ENTRYPOINT制作镜像实现启动容器自动运行apache

FROM busyboxLABEL maintainer="zxhk<237745635@qq.com>"ENV DOC_ROOT="/var/www/html/"RUN mkdir -p ${DOC_ROOT} && \    echo "

test

">${DOC_ROOT}index.htmlENTRYPOINT /bin/httpd -f -h ${DOC_ROOT}

制作镜像并启动容器测试

[root@host1 img2]# docker build -t miniser:v2-2 ./[root@host1 img2]# docker run --name t2 --rm -it miniser:v2-2 ls /data
  • 此时命令会卡住

  • ls /data会作为参数传递给httpd -f -h /data,因为httpd无法识别这个参数,因此会卡住

ENTRYPOINT和CMD组合使用的情况

  • 此时CMD后的内容就会作为默认参数传递给ENTRYPOINT

FROM busyboxLABEL maintainer="zxhk<237745635@qq.com>"ENV DOC_ROOT="/var/www/html/"RUN mkdir -p ${DOC_ROOT} && \    echo "

test

">${DOC_ROOT}index.htmlCMD ["/bin/httpd", "-f", "-h", "${DOC_ROOT}"]ENTRYPOINT ["/bin/sh","-c"]
  • 使用ENTRYPOINT的好处是,他比CMD更方便,因为他可以在启动容器的时候,直接向容器传递命令

案例:在启动容器的时候,动态生成配置文件

1、创建工作目录

[root@host1 img3]# mkdir /img3[root@host1 img3]# cd /img3

2、准备一个shell脚本,用于生成配置文件

[root@host1 img3]# vim entrypoint.sh
#!/bin/shcat>/etc/nginx/conf.d/www.conf<

3、创建测试页面

[root@host1 img3]# echo "test page">index.html

4、编写Dockerfile文件

[root@host1 img3]# vim Dockerfile
FROM nginx:1.14-alpineLABEL author="zxhk<237745635@qq.com>"ENV NGX_DOC_ROOT='/data/web/html/'ADD index.html ${NGX_DOC_ROOT}ADD entrypoint.sh /bin/#nginx的配置文件必须以;为结尾CMD ["/usr/sbin/nginx","-g","daemon off;"]ENTRYPOINT ["/bin/entrypoint.sh"]
  • 在执行dockerfile的时候,CMD的内容会传递到ENTRYPOINT中

  • ENTRYPOIN会启动运行这个shell脚本,shell脚本就是pid为1的进程,shell脚本就会生成配置文件

  • 在脚本的最后会通过exec 来执行nginx,让nginx工作在前台,同时nginx进程顶替shell成为pid为1的进程

5、构建镜像

[root@host1 img3]# docker build -t miniser:v2-4 ./

6、启动容器

[root@host1 img3]# docker run --name nginx1 --rm miniser:v2-4

登录容器看看

[root@host1 ~]# docker exec -it nginx1 /bin/sh/ # / # cat /etc/nginx/conf.d/www.conf server {    server_name c1d255997da4;    listen 0.0.0.0:80;    root /data/web/html/;}/ #

7、再重新启动一个容器,让nginx监听127.0.0.1的8080端口

[root@host1 img3]# docker run --name nginx1 --rm \> -e "PORT=8080" -e "IP=1.2.3.4" miniser:v2-4

再登录容器看看

[root@host1 ~]# docker exec -it nginx1 /bin/sh/ # / # / # cat /etc/nginx/conf.d/www.conf server {    server_name 92c978c97b3c;    listen 127.0.0.1:8080;    root /data/web/html/;}/ #
  • 通过这种方式可以快速的为不同的环境准备特定的配置文件

12、指令12:USER指令

  • 用于指定容器中的主进程是以哪个用户的身份来运行

  • 也可以用来指定在执行dockerfile的CMD RUN ENTRYPOIND的时候,以那个用户的身份来运行

  • 需要确保容器的/etc/passwd中有这个用户,否则会报错

语法格式:

  • USER |

13、指令13:HEALTHCHECK指令

  • 检查容器和容器中的服务是否正常工作

HEALTHCHECK的功能选项

  • --interval=xx 指定每隔多久检查一次(默认每隔30s检查一次)

  • --timeout=xx 指定等待超时时间(默认也是30s)

  • --start-period=xx 启动容器后,等待多久开始做健康检查(默认是0秒,也就是不等)

  • --retries=xx 指定请求几次数据都没获得返回的情况下才认为是出现了异常(默认是3次)

HEALTHCHECK的返回值

  • 0:success成功

  • 1:unhealth不健康

  • 2:预留,没有意义

案例:每隔5分钟检查一次,超时时间是3秒

  • HEALTHCHECK --interval=5m --timeout=3s CMD curl -f http://1.2.3.4 || exit 1

  • 如果健康检查失败,就返回1

14、指令14:SHELL指令

  • 这个是用来指定运行程序的时候默认要用的程序

举例:

SHELL ["/bin/sh","-c"]

15、指令15:STOPSIGNAL指令

  • 这个指令可以指定在执行docker stop的时候,本质上是向容器发送什么什么指令,默认是发送15,如果想执行stop的时候发送9的指令

格式

STOPSIGNAL 9

16、指令16:ARG指令

  • ARG也是定义一个变量,只是这个变量是用在执行build dockerfile的过程中

  • 可以将nginx的版本定义成变量,然后在构建镜像的时候可以通过变量来动态指定作者

编写镜像文件

FROM nginx:1.14-alpineARG info="zxhk<237745635@qq.com>"LABEL author="${info}"ENV NGX_DOC_ROOT='/data/web/html/'ADD index.html ${NGX_DOC_ROOT}ADD entrypoint.sh /bin/#nginx的配置文件必须以;为结尾CMD ["/usr/sbin/nginx","-g","daemon off;"]ENTRYPOINT ["/bin/entrypoint.sh"]

制作镜像

[root@host1 img3]# docker build -t miniser:v2-5 --build-arg new="tom@qq.com" ./
  • Dockerfile中的arg相当于是配置了一个默认值,在制作镜像的时候,如果没有传值,就用默认值

注意区分ENV和ARG

  • docker run的时候可以传值,但是在docker build的时候是无法传值的

  • ENV所定义的变量在够构建镜像的时候使用的,而在构建镜像的时候是只能用ARG的默认值的

17、指令17:ONBUILD指令

  • 本指令其实是定义一个触发器

  • 通过ONBUILD定义的Dcokerfile,在执行docker build的时候不执行,只有别人基于这个镜像做新镜像的时候,才会被执行

案例:如果别人基于这个镜像做新镜像,就让其下载一个文件

第一步:制作一个基础镜像

[root@host1 img3]# vim Dockerfile
FROM nginx:1.14-alpineLABEL author="zxhk<237745635@qq.com>"ENV NGX_DOC_ROOT='/data/web/html/'ADD index.html ${NGX_DOC_ROOT}ADD entrypoint.sh /bin/ONBUILD ADD http://x.x.x.x/xxx /data/web/html/#nginx的配置文件必须以;为结尾CMD ["/usr/sbin/nginx","-g","daemon off;"]ENTRYPOINT ["/bin/entrypoint.sh"]

制作镜像

[root@host1 img3]# docker build -t base:v1.1 ./

第二步:基于基础镜像做新镜像

[root@host1 ~]# mkdir /img4[root@host1 img4]# cd /img4[root@host1 img4]# vim Dockerfile
FROM base:v1-1RUN mkdir /data

制作镜像

[root@host1 img4]# docker build -t newimg:v1-1 ./
镜像 指令 容器 时候 运行 命令 文件 格式 进程 制作 配置 案例 检查 变量 程序 脚本 健康 参数 就是 用户 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 2019年网络安全比赛成员 医院网络安全发布方案 王者上次登录服务器忘记怎么办 服务器raid卡内含有电池吗 网络安全一般指网络系统硬件软件 贵州网络安全系统有哪些 软件开发员工管理制度 吉林运营网络安全工程平台资质 餐厅点餐系统数据库总结致谢 滴滴网络安全审查对滴滴车主影响 猫创互联网科技 惠山区精英软件开发渠道资讯 丹棱软件开发设计 网络安全第三方冒充 人工智能方向和软件开发选哪个 c 更新数据库不成功 双控存储服务器 价格 工具贸易软件开发价格 数据库关系模式的候选关键字 杭州市海康大华软件开发待遇 临沂顺商网络技术 万应互联网科技有限公司 北京筑云互联网科技有限公司 什么是网络安全 文库 网络安全以及保障的能力 网络安全企业的客户主要有哪些 pcl服务器mod请求被中止 数据库运行监控哪些东西 小程序会员系统数据库 吾即互联网科技
0