我必须将应用程序的每个实例作为单独的Docker服务启动。基本映像是相同的,但每个实例的配置文件都不同。现在,问题是我的应用程序对配置文件进行了一些更改。而且我希望配置更改能够保留下来,以便当我的应用程序重新启动(作为docker服务)时,它使用更新后的配置。
我可以使用docker config
将配置文件用作安装点。但是问题是无论我使用哪种模式(rwx
),我都无法从容器内部更新配置文件。挂载的配置始终为只读文件系统。
我执行了以下操作以将配置文件与映像/容器解耦:
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
上,但我无法对其进行编辑。
答案 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