脚本宝典收集整理的这篇文章主要介绍了Dockerfile,脚本宝典觉得挺不错的,现在分享给大家,也给大家做个参考。
使用 exec 模式时,容器中的任务进程就是容器内的 1 号进程,看下面的例子:
FROM ubuntu CMD [ "top" ]
把上面的代码保存到 test1 目录的 Dockerfile 中,然后进入 test1 目录构建镜像并启动一个容器:
$ docker build -t test1 . $ docker run -idt --name testcon test1
然后查看容器中的进程 ID:
$ docker exec testcon ps aux
从图中我们看到运行 top 命令的进程 ID 为 1。exec 模式是建议的使用模式,因为当运行任务的进程作为容器中的 1 号进程时,我们可以通过 docker 的 stop 命令优雅的结束容器(详情请参考《在 docker 容器中捕获信号》)。
exec 模式的特点是不会通过 shell 执行相关的命令,所以像 $HOME 这样的环境变量是取不到的:
FROM ubuntu CMD [ "echo", "$HOME" ]
把上面的代码保存到 test1 目录的 Dockerfile 中,然后进入 test1 目录构建镜像并启动一个容器:
$ docker build --no-cache -t test1 . $ docker run --rm test1
通过 exec 模式执行 shell 可以获得环境变量:
FROM ubuntu CMD [ "sh", "-c", "echo $HOME" ]
把上面的代码保存到 test1 目录的 Dockerfile 中,然后进入 test1 目录构建镜像并启动一个容器:
$ docker build --no-cache -t test1 . $ docker run --rm test1
这次正确取到了 $HOME 环境变量的值。
使用 shell 模式时,docker 会以 /bin/sh -c "task command" 的方式执行任务命令。也就是说容器中的 1 号进程不是任务进程而是 bash 进程,看下面的例子:
FROM ubuntu CMD top
把上面的代码保存到 test2 目录的 Dockerfile 中,然后进入 test2 目录构建镜像并启动一个容器:
$ docker build -t test2 . $ docker run -itd --name testcon2 test2
然后查看容器中的进程 ID:
$ docker exec testcon2 ps aux
1 号进程执行的命令居然是 /bin/sh -c top。而我们指定的 top 命令的进程 ID 为 7。这是由 docker 内部决定的,目的是让我们执行的命令或者脚本可以取到环境变量。
对于 CMD 和 ENTRYPOINT 的设计而言,多数情况下它们应该是单独使用的。当然,有一个例外是 CMD 为 ENTRYPOINT 提供默认的可选参数。我们大概可以总结出下面几条规律: • 如果 ENTRYPOINT 使用了 shell 模式,CMD 指令会被忽略。 • 如果 ENTRYPOINT 使用了 exec 模式,CMD 指定的内容被追加为 ENTRYPOINT 指定命令的参数。 • 如果 ENTRYPOINT 使用了 exec 模式,CMD 也应该使用 exec 模式。真实的情况要远比这三条规律复杂,好在 docker 给出了官方的解释,如下图所示:
以上是脚本宝典为你收集整理的Dockerfile全部内容,希望文章能够帮你解决Dockerfile所遇到的问题。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。