Как динамически редактировать файл в работающем 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. я приведу пример

  1. скажем, у меня есть /home/awan/config.yml <--- этот файл всегда динамический, не должен помещать его в контейнер

  2. я запускаю свой контейнер, чтобы смонтировать эту папку в мой контейнер

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

  1. после этого вы просто редактируете config.yml в вашем /home/awan/config.yml все внесенные вами изменения автоматически применяются внутри вашего докер-контейнера (/home/ubuntu/awan/config.yml) потому что вы его монтируете
Другие вопросы по тегам