首页 > 解决方案 > 如何在运行期间在 Docker Image 中传递 YML 配置文件

问题描述

我已经建立了一个泊坞窗图像。它有一个 YML 配置文件,这是一个像这样的大型配置

contrydata:
  continent: europe
  country: luxembourg
  county: luxembourg
  town: luxembourg
...

我在 docker 运行期间使用这个配置文件。我想将此用作默认配置。如果任何用户想要更改配置,此配置文件在运行期间如何传递给 docker 映像。

我见过一些像这样使用外部配置文件的 docker run 命令

docker run --rm -it -v $(pwd):/data -p 80:80 dockerhub/mydockerimage:v3 --config config.yml

用户可以在哪里配置此文件并可以从外部源传递它。

简而言之,如果用户传递配置文件,则默认配置文件将被提供的config.yml文件替换,否则config.yml将使用默认文件。

标签: docker

解决方案


据我所知,通常这样做的方式是将配置文件映射到容器中的特定位置。Nginx 执行此操作,并在docker run命令上进行卷映射,如下所示-v /host/path/nginx.conf:/etc/nginx/nginx.conf:ro。然后 Nginx 容器总是在同一位置查找配置文件 - /etc/nginx/nginx.conf.

正如您所展示的,我从未见过它作为参数传递。这些参数将被传递给定义为容器入口点的程序。该程序无权访问主机文件系统,因此除非配置文件已使用卷映射到容器,否则该程序将无权访问该文件。

编辑:只是为了好玩,我尝试制作这个 Dockerfile,它构建了一个小的 C 程序,打印出传递给它的任何参数。我还创建了一个 shell 脚本,可以将任何参数传递给pgm. 这几乎就是 Tileserver 的做法。

FROM ubuntu
RUN apt-get update && apt-get install -y gcc
WORKDIR /app
RUN echo '#include <stdio.h> \n\
int main(int argc, char **argv) { \n\
  for (int i=0; i<argc; i++) { \n\
    printf("%s\\n", argv[i]); \n\
  } \n\
}' > pgm.c
RUN gcc -o pgm pgm.c
RUN echo '#!/bin/bash\n\
./pgm "$@"' > docker-entrypoint.sh
RUN chmod 775 docker-entrypoint.sh
ENTRYPOINT ["./docker-entrypoint.sh"]

如果您使用命令构建并运行它

docker build -t test .
docker run --rm test --config config.file

它打印出来

./pgm
--config
config.file

如果你想像 Tileserver 那样做,那么 C 程序就需要打开config.file并使用其中的内容。但当然,如果文件是使用卷映射的,它只能获取它。


推荐阅读