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

标签 python macos docker docker-machine

我有一个正在运行命令的 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 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 的虚拟机(可能是 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/

相关文章:

python - 注册所有子类

Python - 人类喜欢鼠标的行为

Python 原始输入

swift - 找不到 NSNotification.Name.didBecomeActiveNotification

macos - 在不同端口上 Docker 多个站点

python - 使用 python apscheduler 调度作业

macos - mac os x 终端中的奇怪行为

macos - 不要在 vagrant up 命令 PHPStorm 上选择 VagrantFile

docker - traefik+docker-compose获取let's encrypt子域证书失败

database - Postgres服务不断重启