gpt4 book ai didi

mysql - 应该将配置构建到 Docker 镜像中(最佳实践)

转载 作者:行者123 更新时间:2023-12-02 18:50:48 26 4
gpt4 key购买 nike

关闭。这个问题是opinion-based .它目前不接受答案。












想改进这个问题?更新问题,以便 editing this post 可以用事实和引用来回答它.

2年前关闭。




Improve this question




我目前正在寻找部署一个使用 Nginx 代理和 MySQL 实例(以及其他东西)的 Docker 应用程序。

在配置文件(在 Nginx 的情况下)或初始表设置和服务器配置(在 SQL 的情况下)方面,最佳实践是什么?

通常将此配置构建到 Docker 文件中的自定义镜像中更好(因此将标准 Nginx 镜像作为父级并将配置复制到镜像中并构建它)还是在 docker-compose 文件中构建标准 Nginx 文件?并在部署时使用卷和绑定(bind)挂载将配置带入镜像? (以及 SQL 容器的类似问题)。

最佳答案

这里有一点“取决于”。最大的问题是,您希望运行容器的人需要修改多少配置?

如果配置完全固定然后将其构建到容器中。一个很好的例子是一个 nginx 配置文件,用于在 Docker Compose 设置中代理一组其他容器:如果您认为您将使用的其他容器的主机名永远不会改变,那么将其构建到镜像中会更容易。

如果配置中可以更改的内容数量有限,但配置语言允许变量替换 ,然后将引用环境变量的配置文件编译到镜像中,并使用环境变量来调整配置。在我看来,典型的例子是 Rails database.yml.erb可以替换的文件

host: <%= ENV['MYSQL_HOST'] %>

docker run --net some_network -e MYSQL_HOST=mysql myimage

如果配置中可以更改的内容数量有限 ,您还可以在启动时应用变量替换。 sed可以做到这一点;如果您有其他可用的 GNU 工具(可能您的镜像是基于 Debian 或 Ubuntu) envsubst 可以直接做到这一点。入口点脚本可以在您启动主程序之前执行此操作。

#!/bin/sh

# Fill in runtime values for configuration
sed -e "s/MYSQL_HOST/$MYSQL_HOST/" < database.conf.tpl > database.conf

# Run the CMD from the Dockerfile
exec "$@"

...
COPY entrypoint.sh /
RUN chmod +x /entrypoint.sh
ENTRYPOINT ["/entrypoint.sh"]
CMD ["myapp"]

docker run --net some_network -e MYSQL_HOST=mysql myimage

如果有很多复杂的配置选择或者您希望用户只是批发替换配置,绑定(bind)安装它。

docker run -v $PWD/application.conf:/app/application.conf myimage

如果您实际部署到 Kubernetes 你可以把配置文件放在 ConfigMap对象,它的行为本质上与绑定(bind)挂载选项相同。如果您还使用 Helm 之类的工具要管理部署,您可以使用其模板层来设置 ConfigMap 内容。 Helm 模板语言相当复杂,并且具有循环和条件,因此您可以根据部署时设置构建复杂的配置文件。

您还提到了数据库。标准 SQL 数据库容器支持将内容放在 /docker-entrypoint-initdb.d 中。目录,这将在数据库第一次启动时运行。我会尽量减少使用它,并且更喜欢通过数据库迁移系统创建表。这主要是因为这些脚本只有在第一次创建数据库时才会运行,而且无论如何您都需要一个迁移系统;您不想在每次更改架构时都删除所有数据。

关于mysql - 应该将配置构建到 Docker 镜像中(最佳实践),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60800742/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com