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

4

背景

我已经构建了一个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 查看快照照片

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

请查看https://dev59.com/EGAf5IYBdhLWcg3wgzHI#26915343。 - Mikl
3个回答

12

使用docker 1.3版本,新增了一个命令docker exec。该命令允许您进入正在运行的docker容器:

docker exec -it <container-id> bash

1
从提出的问题来看,最好的答案是从nsenter到exec。Docker正在不断发展壮大。 - feuyeux
docker exec -it <container-id> bash 这只有在你的 Docker 镜像中启用了 Bash 的情况下才能工作,另外你也可以写成 "/bin/bash"。 - Mohit Sharma

2
你已经给容器取了一个名字,所以可以使用该名称查找它。
然后使用nsenter (man nsenter) 发送你想要执行的命令。
nsenter --target $$(docker inspect --format {{.State.Pid}} <container_name_or_ID>) --mount --uts --ipc --net --pid <cmd>

如何在正在运行的容器中编写内容以及更多信息和解决方案:如果您在Docker容器中运行SSHD,则是错误的做法!


如果您按照链接中Jerome的说明进行安装,则还将获得docker-enter脚本,该脚本自动化了对nsenter的丑陋参数:docker-enter <container_name> - Adam

0

你只需要使用 -v 选项挂载文件夹。我给一个例子:

  1. 假设我有 /home/awan/config.yml <--- 这个文件总是动态的,不能放在容器内部。

  2. 我运行我的容器,这样我就可以将那个文件夹挂载到我的容器中。

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

  1. 之后,在你的 /home/awan/config.yml 中编辑 config.yml,每应用一次更改都会自动应用到您的 Docker 容器 (/home/ubuntu/awan/config.yml) 中,因为您已经挂载了它。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接