Есть ли способ сделать конфигурацию Docker редактируемой изнутри контейнера? - PullRequest
1 голос
/ 05 мая 2019

Я должен запускать каждый экземпляр моего приложения как отдельную службу Docker. Базовый образ такой же, но файл конфигурации отличается для каждого экземпляра. Теперь проблема в том, что мое приложение вносит некоторые изменения в файл конфигурации. И я хочу, чтобы изменения конфигурации сохранялись, чтобы при перезапуске моего приложения (в качестве службы Docker) оно использовало обновленную конфигурацию.

Я могу использовать файл конфигурации в качестве точки монтирования, используя docker config. Но проблема не в том, какой режим (rwx) я задаю, я не могу обновить файл конфигурации изнутри контейнера. Смонтированная конфигурация всегда Файловая система только для чтения .

1. Как внести изменения в файл конфигурации из контейнера Docker?

2. Как сделать, чтобы обновленный файл конфигурации сохранялся за пределами контейнера, чтобы при перезапуске службы использовалась обновленная конфигурация?

Я сделал следующее, чтобы отделить файл конфигурации от образа / контейнера:

docker config create my-config config.txt
docker service create \
--name redis \
--config src=my-config,target=/config.txt,mode=0660 \
redis:alpine
docker container exec -ti <containerId> /bin/sh

Файл конфигурации смонтирован на /config.txt, но я не могу его редактировать.

Ответы [ 2 ]

1 голос
/ 05 мая 2019

Конфиг будет доступен только для чтения. Но вы можете скопировать это в другой файл внутри контейнера как часть сценария точки входа, определенного на вашем изображении.

docker config create my-config config.txt
docker service create \
--name redis \
--config src=my-config,target=/config.orig,mode=0660 \
username/redis:custom

Скрипт точки входа будет включать следующее:

if [ ! -f /config.txt -a -f /config.orig ];
  cp /config.orig /config.txt
fi
# skipping the typical exec command here since redis has its own entrypoint
# exec "$@" # run the CMD as pid 1
exec docker-entrypoint.sh "$@"

Ваш Dockerfile для создания этого образа будет выглядеть так:

FROM redis:alpine
COPY /entrypoint.sh /
ENTRYPOINT [ "/entrypoint.sh" ]

И вы бы построили это с:

docker build -t username/redis:custom .
0 голосов
/ 05 мая 2019

Конфиги Docker Swarm доступны только для чтения не только внутри контейнера, но и снаружи. чтобы обновить конфигурацию вашей службы, вы должны создать новую конфигурацию, как описано в документации по docker swarm

Как мне обновить конфигурацию моего сервиса?
Вам необходимо скопировать конфиг, отредактировать его, сохранить с новым именем, а затем обновить сервис

# Get the config from docker to file
docker config inspect --pretty my-config | tail -n +6 > conf-file 
# Edit conf-file as needed here
...
# Save it with new name
docker config create my-config-v2 conf-file
# Update the service
docker service update \
  --config-rm my-config \
  --config-add source=my-config-v2,target=/config.txt \
  redis:alpine

Как обновить конфигурацию изнутри контейнера?
Для этого вам понадобится доступ к докеру из контейнера. это можно сделать, подключив исполняемый файл docker и носок docker к контейнеру:

docker run -it -v /var/run/docker.sock:/var/run/docker.sock \
               -v /usr/bin/docker:/usr/bin/docker \
       ubuntu bash
...