我有一个正在运行命令的 docker 容器。在 Dockerfile 中,最后一行是 CMD ["python", "myprogram.py"]
。这运行了一个 Flask 服务器。
我更新时有一些场景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 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 的虚拟机(可能是 virtualbox)中创建一个挂载点。
您将拥有以下方案:
<Dir to share from your host (OSX)> <= (1) mounted on => <Mountpoint on VM> <= (2) mounted on => <Container mountpoint>
(2) 与 Linux 案例一模一样(事实上,它是一个 Linux 案例)。
添加的唯一步骤是在虚拟机上安装您想要从主机共享的目录。
以下是在虚拟机的挂载点上挂载要共享的目录,然后将其与容器一起使用的步骤:
1-首先停止docker机器。
docker-machine stop <machine_name>
2- 将共享文件夹添加到虚拟机。
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- 在虚拟机中卸载:
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出于学习目的,如果对您有帮助,请随意使用。
关于python - 有没有办法停止 docker 容器中的命令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36726799/