首页 > 解决方案 > 有没有办法让 docker config 从容器内部编辑?

问题描述

我必须将应用程序的每个实例作为单独的 Docker 服务启动。基本映像相同,但每个实例的配置文件不同。现在,问题是我的应用程序对配置文件进行了一些更改。而且我希望配置更改保持不变,以便当我的应用程序重新启动(作为 docker 服务)时,它使用更新的配置。

我可以将配置文件用作挂载点,使用docker config. 但问题是无论rwx我给出什么模式(),我都无法从容器内部更新配置文件。挂载的配置始终是Read-only file system

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但我无法编辑它。

标签: dockerdocker-composedockerfiledocker-swarm

解决方案


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

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 .

推荐阅读