如何在运行的docker容器中dynamic地编辑文件

背景

我已经build立了一个npm服务器(sinopia)docker镜像( https://github.com/feuyeux/docker-atue/blob/master/docker-images/feuyeux_sinopia.md ),并且在CMD行中,它将启动每当容器生成时。

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

这个shell会dynamic地创build一个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,因为我希望内容应该按需更改。

在这里输入图像说明 看快照照片

如上所示,第一行运行一个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 

随着docker1.3,有一个新的命令docker exec 。 这可以让你input一个正在运行的docker:

 docker exec -it <container-id> bash 

你命名你的容器,所以你可以使用这个名字find它。

然后使用nsenter( man nsenter )发送你想要做的命令。

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

有关如何在运行容器中写入内容的更多信息和解决scheme: 如果您在Docker容器中运行SSHD,那么您做错了!

你只需要使用-v作为选项来安装文件夹。 我举一个例子

  1. 比方说,我有/home/awan/config.yml <—这个文件总是dynamic的,不能放在容器内

  2. 我运行我的容器,所以我可以将该文件夹挂载到我的容器中

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

  1. 之后你只需在你的/home/awan/config.yml config.yml中编辑config.yml ,每次你在/home/awan/config.yml容器( /home/ubuntu/awan/config.yml )中应用automaticaly的修改都会被挂载