Как динамически редактировать файл в работающем Docker-контейнере
Фон
Я создал образ докера сервера npm (sinopia) ( https://github.com/feuyeux/docker-atue/blob/master/docker-images/feuyeux_sinopia.md), и в строке CMD он запустит запуск.sh каждый раз, когда контейнер генерируется.
CMD ["/opt/sinopia/start.sh"]
Эта оболочка будет динамически создавать файл 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, когда контейнер работает, потому что я надеюсь, что содержимое должно быть изменено по требованию.
Как показано выше, первая строка запускает контейнер с синопией, и в этом контейнере находится /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 ответа
С докером 1.3 появилась новая команда docker exec
, Это позволяет вам ввести работающий докер:
docker exec -it <container-id> bash
Вы назвали свой контейнер, так что вы можете найти его по этому имени.
Затем используйте nsenter ( man nsenter), чтобы отправить команду, которую вы хотите сделать.
nsenter --target $$(docker inspect --format {{.State.Pid}} <container_name_or_ID>) --mount --uts --ipc --net --pid <cmd>
Дополнительная информация и решение о том, как писать внутри работающего контейнера: если вы запускаете SSHD в своих контейнерах Docker, вы делаете это неправильно!
Вам просто нужно смонтировать папку, используя опцию -v. я приведу пример
скажем, у меня есть
/home/awan/config.yml
<--- этот файл всегда динамический, не должен помещать его в контейнеря запускаю свой контейнер, чтобы смонтировать эту папку в мой контейнер
#sudo docker run -i -t -v /home/awan:/home/ubuntu/awan ubuntu/14.04 /bin/bash
- после этого вы просто редактируете
config.yml
в вашем/home/awan/config.yml
все внесенные вами изменения автоматически применяются внутри вашего докер-контейнера (/home/ubuntu/awan/config.yml
) потому что вы его монтируете