Ben*_*ome 4 mysql nginx web docker
我目前正在寻求部署一个使用 Nginx 代理和 MySQL 实例(除其他外)的 Docker 应用程序。
当涉及到配置文件(对于 Nginx)或初始表设置和服务器配置(对于 SQL)时,最佳实践是什么?
通常,是将此配置构建到 Docker 文件中的自定义映像中(因此以标准 Nginx 映像作为父级并将配置复制到映像中并构建它)还是在 docker-compose 文件中构建标准 Nginx 文件更好并使用卷和绑定安装在部署时将配置带入映像中?(以及 SQL 容器的类似问题)。
这里有一点“视情况而定”。最大的问题是,您预计运行容器的人需要修改多少配置?
如果配置完全固定,那么只需将其构建到容器中即可。一个很好的例子是 nginx 配置文件,用于代理 Docker Compose 设置中的一组其他容器:如果您认为您将使用的其他容器的主机名永远不会改变,那么将其构建到映像中会更容易。
如果配置可以更改的内容有限,但配置语言允许变量替换,则将引用环境变量的配置文件编译到映像中,并使用环境变量来调整配置。在我看来,这方面的典型示例是一个 Railsdatabase.yml.erb文件,您可以在其中替换
host: <%= ENV['MYSQL_HOST'] %>
Run Code Online (Sandbox Code Playgroud)
docker run --net some_network -e MYSQL_HOST=mysql myimage
Run Code Online (Sandbox Code Playgroud)
如果配置中可以更改的内容数量有限,您还可以在启动时应用变量替换。 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 "$@"
Run Code Online (Sandbox Code Playgroud)
...
COPY entrypoint.sh /
RUN chmod +x /entrypoint.sh
ENTRYPOINT ["/entrypoint.sh"]
CMD ["myapp"]
Run Code Online (Sandbox Code Playgroud)
docker run --net some_network -e MYSQL_HOST=mysql myimage
Run Code Online (Sandbox Code Playgroud)
如果有许多复杂的配置选择,或者您希望用户批量替换配置,请将其绑定安装。
docker run -v $PWD/application.conf:/app/application.conf myimage
Run Code Online (Sandbox Code Playgroud)
如果您实际上要部署到 Kubernetes 中,您可以将配置文件放入ConfigMap对象中,其行为本质上与绑定安装选项相同。如果您还使用Helm等工具来管理部署,那么您可以使用其模板层来设置 ConfigMap 内容。Helm 模板语言相当复杂,并且具有循环和条件,因此您可以根据部署时设置构建复杂的配置文件。
您还提到了数据库。标准 SQL 数据库容器支持将内容放入/docker-entrypoint-initdb.d目录中,这将在数据库第一次启动时运行。我会尽量减少它的使用,并且更喜欢通过数据库迁移系统创建表。这主要是因为这些脚本仅在第一次创建数据库时运行,并且无论如何您都需要一个迁移系统;您不希望每次更改架构时都需要删除所有数据。
| 归档时间: |
|
| 查看次数: |
1131 次 |
| 最近记录: |