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

时间:2016-04-19 18:38:44

标签: python macos docker docker-machine

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

有些情况下,我更新myprogram.py并需要终止命令,将更新的myprogram.py文件传输到容器,然后再次执行python myprogram.py。我认为这是一个常见的场景。

但是,我还没有办法做到这一点。因为这是Dockerfile中唯一的命令......我似乎无法杀死它。在我运行ps -aux时从容器终端我可以看到python myprogram.py被赋予了1的PID。但是当我尝试用kill -9 1杀死它时,它似乎不起作用。

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

2 个答案:

答案 0 :(得分:1)

您可以使用VOLUMES在容器上安装 myprogram.py 源代码,只需docker stopdocker restart容器。

制作音量:

在Dockerfile中添加 VOLUME 指令并重建图片:

VOLUME /path/to/mountpoint

并在运行图片时使用-v选项。

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

/!\上述步骤仅适用于Linux环境。 /!\

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

您将拥有以下方案:

<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-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创建mountpoint并在其上安装共享文件夹:

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-停止VM:

docker-machine stop <machine_name>

8-删除共享文件夹:

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

这是a script我为研究目的而做的,如果可以帮助你,请随时使用它。

答案 1 :(得分:1)

  

有些情况下,我更新myprogram.py并需要杀死   命令,将更新的myprogram.py文件传输到容器,然后   再次执行python myprogram.py。我想这是一个常见的   场景。

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

  • 杀死现有容器
  • 通过Dockerfile构建新图像
  • 从新图像引导容器

或者:

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

任何一个都有效。第二个对于开发很有用,因为它的转换速度稍快一些。