docker - 如何在运行期间在 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
将使用默认文件。
解决方案
据我所知,通常这样做的方式是将配置文件映射到容器中的特定位置。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
并使用其中的内容。但当然,如果文件是使用卷映射的,它只能获取它。
推荐阅读
- python - Django Rest Framework POST 和 PUT 外键 ModelSerializer
- java - Java - 嵌套对象数据
- sql - 将字符串转换为算术运算符
- c - 如何在 powertip pc1602f b 16x2 LCD 显示模块上显示数字时钟?
- javascript - Vue - 如何只选择下拉菜单中的搜索结果
- c++ - 为什么我不能在同一代码行中创建和打开 ofstream?
- javascript - Bcrypt没有散列
- c# - Why is IMemoryCache's TryGetValue throwing an InvalidOperationException?
- node.js - 方法 findOrCreate() 未从我的用户模型中解析
- rest - HTTP code to return for unsupported PATCH