有没有一种方法可以使Docker配置可从容器内部进行编辑?

时间:2019-05-05 05:35:38

标签: docker docker-compose dockerfile docker-swarm

我必须将应用程序的每个实例作为单独的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 个答案:

答案 0 :(得分:1)

该配置仅在设计时是只读的。但是,您可以将其复制到容器中的另一个文件中,作为映像中定义的入口点脚本的一部分。

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 .

答案 1 :(得分:0)

Docker swarm配置是只读的,不仅从容器内部而且从外部也是如此。要更新服务的配置,您必须按照docker swarm config docs

中的说明创建新的配置

如何更新服务的配置?
 您需要复制配置,进行编辑,以新名称保存,然后更新服务

tree_path= (ROW#, LENGTH(prices) - ROW#)

如何从容器内部更新配置?
为此,您需要从容器内部访问docker。您可以通过将docker可执行文件和docker袜子安装到容器上来做到这一点:

# 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