如何在正在运行的docker容器中动态编辑文件

时间:2014-08-22 11:34:58

标签: docker nsenter linux-containers

背景

我已经构建了一个npm服务器(sinopia)docker镜像(https://github.com/feuyeux/docker-atue/blob/master/docker-images/feuyeux_sinopia.md),并且在CMD行中,每次生成容器时它都会运行start.sh。

CMD ["/opt/sinopia/start.sh"]

此shell将动态创建一个yaml文件。

sed -e 's/\#listen\: localhost/listen\: 0.0.0.0/' -e 's/allow_publish\: admin/allow_publish\: all/' /tmp/config.yaml > /opt/sinopia/config.yaml

问题

我希望我可以在容器运行时编辑这个config.yaml,因为我希望内容应该按需更改。

enter image description here see the snapshot photo

如上所示,第一行运行 sinopia 容器,在此容器中有/opt/sinopia/config.yaml。但我不知道如何获取此运行容器并编辑和检查此文件。 如果我按照 sinopia-ls 的行进行操作,则会运行一个新容器,而不是之前运行的容器。

谢谢你们!

回答(详情请见下面我接受的内容)

sudo nsenter --target $PID --mount --uts --ipc --net --pid

root@58075317e47d:/# ls /opt/sinopia/
config.yaml  config_gen.js  start.sh  storage
root@58075317e47d:/# cat /opt/sinopia/config.yaml

3 个答案:

答案 0 :(得分:11)

使用docker 1.3,有一个新命令docker exec。这允许您输入正在运行的泊坞窗:

docker exec -it <container-id> bash

答案 1 :(得分:2)

您为容器命名,因此您可以使用该名称找到它。

然后使用nsenter(man nsenter)发送您想要执行的命令。

nsenter --target $$(docker inspect --format {{.State.Pid}} <container_name_or_ID>) --mount --uts --ipc --net --pid <cmd>

有关如何在正在运行的容器内写入的更多信息和解决方案:If you run SSHD in your Docker containers, you're doing it wrong!

答案 2 :(得分:0)

您只需要使用-v作为选项挂载文件夹。我举个例子

  1. 假设我有/home/awan/config.yml&lt; ---这个文件总是动态的,不能把它放在容器里

  2. 我运行我的容器,以便我可以将该文件夹安装到我的容器中

  3. #sudo docker run -i -t -v /home/awan:/home/ubuntu/awan ubuntu/14.04 /bin/bash

    1. 之后,您只需在config.yml中修改/home/awan/config.yml中您自动应用于Docker容器(/home/ubuntu/awan/config.yml)中的所有更改,因为您已将其挂载