在容器启动时启动一个进程
当你在开发容器中工作时,你可能希望每次容器启动时执行一个命令或启动一些东西。执行此操作的最简单方法是使用开始后命令物业在devcontainer.json例如,如果你想要运行yarn 安装每次连接到容器以更新依赖项时,您可以添加以下内容:
"postStartCommand":"yarn install"
视频:在容器创建时运行 npm install
在其他情况下,您可能希望启动一个进程并让它继续运行。这可以通过使用来实现无挂断将进程后台运行使用输入:&例如:
"postStartCommand": "nohup bash -c '你的命令在这里 &'"
视频:每次容器启动时运行“npm start”
熟悉 Linux 的人可能会期望能够使用系统控制用于启动和停止由某种东西管理的后台服务的命令系统守护进程不幸的是,系统守护进程因此,它存在 overhead 并且通常不作为容器使用。
在许多情况下,有一个命令可以替代(例如,sshd). 而在Debian/Ubuntu上,通常在以下目录下有脚本/etc/init.d你可以直接运行。
"postStartCommand": "/etc/init.d/ssh start"
这些系统还包括一个服务命令将使用系统控制或/etc/init.d基于已安装内容的脚本。
"postStartCommand":"service ssh start"
视频:在容器中启动SSH服务
将启动命令添加到Docker镜像中
当开始后命令 方便,并允许你在源代码树中执行命令,你也可以将这些步骤添加到Dockerfile中,使用自定义的 ENTRYPOINT 或 CMD。
当引用Dockerfile时devcontainer.json默认的入口点和命令被覆盖。首先,使用以下方法禁用此行为覆盖命令财产。
"覆盖命令": false
该覆盖命令属性默认为真因为如果没有指定命令,许多镜像将立即退出。相反,我们需要在Dockerfile中处理这个问题。
接下来,考虑这个Dockerfile:
来自 mcr.microsoft.com/devcontainers/base:1-ubuntu
复制 docker-entrypoint.sh /
运行 chmod +x /docker-entrypoint.sh
入口点 [ "/docker-entrypoint.sh" ]
命令 [ "睡眠", "无限" ]
该命令这里确保容器默认保持运行状态。将您的启动步骤保持在入口点允许您在使用时安全地覆盖命令docker 运行使用您的镜像或Docker Compose。这解析为以下内容:
/docker-entrypoint.sh 睡眠 无限
接下来,创建一个docker-entrypoint.sh脚本:
#!/usr/bin/env bash
回声 "来自我们的入口点!"
执行 "$@"
你在这个文件中执行的任何内容都会在容器每次启动时运行。然而,重要的是要包括最后的执行 "$@"行,因为这是会导致命令执行的睡眠无限在我们的例子中触发。
最后,如果你使用Docker Compose,请确保你的容器没有设置entrypoint或command属性。