启动容器时自动运行命令

未匹配的标注

在开发容器中工作时,可能每次都会想要执行一个命令或是启动一些东西。最简单的方式是使用 devcontainer.json 中的 postStartCommand 指令。比如说,每次连接容器的时候,都希望项目的依赖可以保持最新,所以会运行 yarn install。就可以这样来设置 devcontainer.json :

比如我是做前端的,希望打开容器的时候,前端项目已经启动并且持续保持运行。这样网页浏览器就可以随时访问进行调试了。我在这里就会把 postStartCommand *设置为 *npm run dev 。不过要持续运行的话,需要使用 nohup *,否则命令在15分钟后会被 kill 掉。命令同时还使用 *& 将进程置于后台。

熟悉 Linux 的朋友可能会想着能够使用 *systemctl *命令来启停由 *systemd *管理的后台服务。但是不幸的是,因为 *systemd *有额外的开销,所有(宿主为Windows的)容器中,通常都不使用。

基于以上事实,有些后台服务可以直接使用对应的命令来启动,比如 sshd *。在 Debian/Ubuntu 上,通常在 */etc/init.d 路径下,有脚本可以直接运行。比如:

这些系统还有一个叫 *service *的命令,根据系统上是不是安装了 systemctl,而分别使用 systemctl 或 /etc/init.d 脚本:

或者,你也可以把启动命令添加到 Docker 镜像中

尽管 postStartCommand 命令很方便,让你能够在源码树中执行命令,你也可以使用自定义的 *ENTRYPOINT *或 *CMD *,来把这些步骤加入到 Dockerfile 中。

devcontainer.json 中引用 Dockerfile 的时候,默认的入口和命令会被覆盖。首先,使用 *overrideCommand *属性来禁用这个行为。

因为如果没有指定命令的话,很多镜像会立即退出,所以 overrideCommand 属性默认设为 true 。不过,我们会在 Dockerfile 来处理启动命令的配置。

假设有这样一个 Dockerfile :

这里的 CMD 会确保容器默认情况下保持运行。把启动步骤放在 ENTRYPOINT 中,让你在使用 docker run 运行镜像 或 使用 Docker Compose 的时候,可以安全地覆盖命令。所以,合起来就变成了这样:

接着,创建一个 docker-entrypoint.sh 脚本:

这个文件里执行的所有命令,都会在容器每次启动时触发。不过,最后都要记得加上 exec “$@” ,因为只有这样才能触发我们加上的 sleep infinity 命令。

启动开发容器时,自动启动命令的相关内容,就是以上这些。如果喜欢我的文章的话,欢迎关注矻矻来福,点赞、评论、转发都是莫大的支持。我们下期不见不散。

本文章首发在 LearnKu.com 网站上。

上一篇 下一篇
秦晓武
讨论数量: 0
发起讨论 只看当前版本


暂无话题~