在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
我们在上篇小作文[docker容器dockerfile详解]对中dockerfile有了比较全面的认识,我们也提到`ENTRYPOINT`和`CMD`都可以指定容器启动命令。因为这两个命令是掌握dockerfile编写的核心,所以这边还是单独拿出来再讲一讲。 一、写在前面我们在上篇小作文docker容器dockerfile详解对中dockerfile有了比较全面的认识,我们也提到 二、CMD 与 ENTRYPOINT主要区别我们直接进入主题,CMD 与 ENTRYPOINT都是用于指定启动容器执行的命令,区别在于:
为了使构建的容器可以正常启动,我们编写的dockerfile文件必须包含一个CMD或ENTRYPOINT指令。 三、CMD 与 ENTRYPOINT的结合使用1.CMD
dockerfile文件中包含多个CMD时,只有最后一个被加载使用。 我们在dockerhub中搜索centos官方镜像,看一下的官方dockerfile文件。 基本上每一个官方镜像都会为我们提供各自版本的dockerfile链接,如下: 我们查看 FROM scratch ADD centos-8-x86_64.tar.xz / LABEL org.label-schema.schema-version="1.0" org.label-schema.name="CentOS Base Image" org.label-schema.vendor="CentOS" org.label-schema.license="GPLv2" org.label-schema.build-date="20201204" CMD ["/bin/bash"] 只有四行,这就是构建一个 不止centos,其他debian、ubuntu、busybox等镜像都只需通过CMD指定启动命令。比如busybox更为简约: FROM scratch ADD busybox.tar.xz / CMD ["sh"] 这种基础类、工具类镜像的构建我们只需要指定一个必要CMD来启动容器即可。但是我们编写一个dockerfile并不是为了启动容器而编写,大多数时候我们要在容器运行我们的app,运行我们的服务。 当然通过CMD也可以启动,可是如此一来有一个缺陷,我们上面说到的CMD的启动命令会被docker run 参数代替。 我们有下面Dockerfile [root@localhost dockerfiles]# cat Dockerfile FROM centos CMD ["/bin/top","-b"] 构建后,使用参数ps启动容器。 [root@localhost dockerfiles]# docker run -it centos_top:v1 ps PID TTY TIME CMD 1 pts/0 00:00:00 ps 可看看到启动容器后 2.ENTRYPOINT结合CMD
上面我们提到 我们以nginx官方dockerfile latest版本1.21为例 首先我们查看 ... COPY docker-entrypoint.sh / COPY 10-listen-on-ipv6-by-default.sh /docker-entrypoint.d COPY 20-envsubst-on-templates.sh /docker-entrypoint.d COPY 30-tune-worker-processes.sh /docker-entrypoint.d ENTRYPOINT ["/docker-entrypoint.sh"] EXPOSE 80 STOPSIGNAL SIGQUIT CMD ["nginx", "-g", "daemon off;"] 从上面我们可以看到,在启动nginx容器时首先运行 #docker-entrypoint.sh nginx -g "daemon off;" 当我们使用docker run 传入参数会怎样? 我传入nginx-debug #docker run -dt nginx nginx-debug -g "daemon off;" 此时启动容器相当于执行如下脚本与参数 #docker-entrypoint.sh nginx-debug -g "daemon off;" 我们通过ps来看一下我们启动的容器 [root@localhost dockerfiles]# ps -ef|grep nginx root 6327 6306 0 Aug12 pts/0 00:00:00 nginx: master process nginx -g daemon off; 101 6384 6327 0 Aug12 pts/0 00:00:00 nginx: worker process 101 6385 6327 0 Aug12 pts/0 00:00:00 nginx: worker process root 16800 16780 3 12:51 pts/0 00:00:00 nginx: master process nginx-debug -g daemon off; 101 16857 16800 0 12:51 pts/0 00:00:00 nginx: worker process 101 16858 16800 0 12:51 pts/0 00:00:00 nginx: worker process 显然我们两种参数nginx、nginx-debug的容器都启动成功! 也就是说我们通过 docker-entrypoint.sh是什么?docker-entrypoint.sh这是一个预处理脚本通常用来过滤命令行参数或者执行exec 来启动容器为1的进程。 通过ENTRYPOINT+CMD实现命令默认参数或接收docker run 参数是一种非常流行并且有用的dockerfile编写方式。 到此这篇关于dockerfile中ENTRYPOINT与CMD的结合的文章就介绍到这了,更多相关dockerfile中ENTRYPOINT与CMD内容请搜索极客世界以前的文章或继续浏览下面的相关文章希望大家以后多多支持极客世界! |
请发表评论