我目前正在寻找一个部署使用Nginx代理和一个MySQL实例的Docker应用程序。
关于配置文件(对于Nginx)或初始表设置和服务器配置(对于SQL)的最佳实践是什么?
通常将此配置构建到Docker文件中的自定义映像中更好(因此,将标准Nginx映像作为父映像并将配置复制到该映像中并进行构建)还是在docker-compose文件中构建标准Nginx文件并在部署时使用卷和绑定挂载将配置导入映像?(以及SQL容器的类似问题)。
这里有些“取决于”。最大的问题是,您期望运行容器的人员需要多少修改配置?
如果配置完全固定,则只需将其构建到容器中即可。一个很好的例子是一个nginx配置文件,用于代理Docker Compose设置中的一组其他容器:如果您认为将要使用的其他容器的主机名不会改变,则将其构建到映像中会更容易。
如果配置中可以更改的事物数量有限,但是配置语言允许变量替换,则将引用环境变量的配置文件编译到映像中,然后使用环境变量来调整配置。我想到的一个典型示例是一个Railsdatabase.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
如果有许多复杂的配置选择,或者您希望用户只批发替换配置,则将其绑定安装。
docker run -v $PWD/application.conf:/app/application.conf myimage
如果您实际上是在Kubernetes中进行部署,则可以将配置文件放在ConfigMap对象中,该对象的行为本质上与bind-mount选项相同。如果您还使用诸如Helm之类的工具来管理部署,则可以使用其模板层来设置ConfigMap内容。Helm模板语言相当复杂,并且具有循环和条件,因此您可以基于部署时设置构建复杂的配置文件。
您还提到了数据库。标准的SQL数据库容器支持将内容放置在/docker-entrypoint-initdb.d
目录中,并且这将在数据库首次启动时运行。我会尽量减少使用它,而是更喜欢通过数据库迁移系统创建表。通常,这是因为这些脚本仅在首次创建数据库时才运行,并且无论如何您都需要一个迁移系统。您不需要每次更改架构时都删除所有数据。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句