有没有办法停止 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 stop
和 docker 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 构建新镜像
- 从新镜像启动容器
或者:
- 使用指向源的卷装载启动容器
- 更新代码后重新启动容器
两者都行。第二个对开发很有用,因为它的周转速度稍快。
我有一个 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 stop
和 docker 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 构建新镜像
- 从新镜像启动容器
或者:
- 使用指向源的卷装载启动容器
- 更新代码后重新启动容器
两者都行。第二个对开发很有用,因为它的周转速度稍快。