【问题标题】:Is there a way to make docker config editable from inside a container?有没有办法让 docker config 从容器内部编辑?
【发布时间】:2019-05-05 05:35:38
【问题描述】:

我必须将我的应用程序的每个实例作为单独的 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,但我无法编辑它。

【问题讨论】:

    标签: docker docker-compose dockerfile docker-swarm


    【解决方案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 .
    

    【讨论】:

    • 复制已安装的配置文件是一种不错的方法。但是如何使配置更改保持不变,以便在我重新启动服务时我有一个更新的配置文件?
    • 另外,我的excel文件是一个excel表
    • @risabhRizz 如果您想要持久性,那就是一个卷,您不再需要集中管理的配置。我不明白 excel 文件参考,这是关于 redis 映像的 docker 配置。
    【解决方案2】:

    Docker swarm 配置是只读的,不仅来自容器内部,也来自外部。要更新您的服务配置,您必须按照docker swarm config docs 中的说明创建一个新配置

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

    # 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 sock 安装到容器来实现:

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

    【讨论】:

      猜你喜欢
      • 2019-11-06
      • 2021-08-22
      • 2021-06-16
      • 2010-10-26
      • 2021-01-23
      • 2019-08-16
      • 1970-01-01
      相关资源
      最近更新 更多