有没有办法停止 docker 容器中的命令

Is there a way to stop a command in a docker container

我有一个 docker 容器,它正在 运行 命令中。在 Dockerfile 中,最后一行是 CMD ["python", "myprogram.py"] 。这 运行 是一个烧瓶服务器。

有些场景我更新myprogram.py需要kill命令,将更新后的myprogram.py文件传到容器中,再执行python myprogram.py。我想这是一个常见的场景。

但是,我还没有找到执行此操作的方法。因为这是 Dockerfile 中唯一的命令......我似乎无法杀死它。从容器终端,当我 运行 ps -aux 我可以看到 python myprogram.py 被分配了一个 PID 1。但是当我试图用 kill -9 1 杀死它时,它似乎没有上班。

有解决办法吗?我的目标是能够在我的主机上更改 myprogram.py,将更新后的 myprogram.py 传输到容器中,然后再次执行 python myprogram.py

您可以使用 VOLUMES 将您的 myprogram.py 源代码挂载到您的容器中,并且仅 docker stopdocker restart 容器。

制作一卷:

在您的 Docker 文件中添加一个 VOLUME 指令并重建您的图像:

VOLUME /path/to/mountpoint

并在 运行 调整图像时使用 -v 选项。

docker run -d -v /path/to/dir/to/mount:/path/to/mountpoint myimage

/!\ 以上这些步骤仅适用于 Linux 环境。 /!\

要将它与其他东西一起使用(例如 OSX 上的 Docker-machine),您还必须在 VM 运行ning Docker 中创建一个挂载点(可能是 virtualbox)。

您将有以下方案:

<Dir to share from your host (OSX)> <= (1) mounted on => <Mountpoint on VM> <= (2) mounted on => <Container mountpoint>

(2)与Linux情况完全一样(事实上,它是linux情况)。

添加的唯一步骤是将要从主机共享的目录安装到 VM 上。

以下是将要共享的目录挂载到 VM 的挂载点上,然后将其与容器一起使用的步骤:

1- 首先停止 docker 机器。

docker-machine stop <machine_name>

2- 将共享文件夹添加到 VM。

VBoxManage sharedfolder add <machine_name> --name <mountpoint_name> --hostpath <dir_to_share>

3- 重启 docker 机器:

docker-machine start <machine_name>

4- 使用 ssh 创建挂载点并在其上挂载共享文件夹:

docker-machine ssh <machine_name> "sudo mkdir <mountpoint_in_vm>; sudo mount -t vboxsf <mountpoint_name> <mountpoint_in_vm>"

5- 然后将目录挂载到容器中,运行 :

docker run -d -v <mountpoint_in_vm>:</path/to/mountpoint (in the container)> myimage

并在您不再需要时清理所有这些:

6- 在 VM 中卸载:

docker-machine ssh <machine_name> "sudo umount <mountpoint_in_vm>; sudo rmdir <mountpoint_in_vm>"

7- 停止虚拟机:

docker-machine stop <machine_name>

8- 删除共享文件夹:

VBoxManage sharedfolder remove <machine_name> --name <mountpoint_name>

这是a script我为了学习而制作的,如果对你有帮助,欢迎使用。

There are scenarios when I update myprogram.py and need to kill the command, transfer the updated myprogram.py file to the container, and execute python myprogram.py again. I imagine this to be a common scenario.

不是真的。常见的情况是:

  • 杀死现有容器
  • 通过 Dockerfile 构建新镜像
  • 从新镜像启动容器

或者:

  • 使用指向源的卷装载启动容器
  • 更新代码后重新启动容器

两者都行。第二个对开发很有用,因为它的周转速度稍快。