我有一个运行命令的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
。
答案 0 :(得分:1)
您可以使用VOLUMES在容器上安装 myprogram.py 源代码,只需docker stop
和docker 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。我想这是一个常见的 场景。
不是真的。常见的情况是:
或者:
任何一个都有效。第二个对于开发很有用,因为它的转换速度稍快一些。