应该将配置内置到Docker映像中(最佳实践)

本杰明·罗杰斯-纽瑟

我目前正在寻找一个部署使用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] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

构建/部署Docker映像的最佳实践

来自分类Dev

构建/部署Docker映像的最佳实践

来自分类Dev

将git存储库添加到Docker映像(工作流最佳实践)

来自分类Dev

将git存储库添加到Docker映像(工作流最佳实践)

来自分类Dev

在构建期间将文件复制到Docker映像中

来自分类Dev

将本地项目导入到jBPM Docker映像中

来自分类Dev

将Docker映像中的TLD路由到127.0.0.1

来自分类Dev

在构建期间将文件复制到Docker映像中

来自分类Dev

我应该将package-lock.json复制到Dockerfile中的容器映像吗?

来自分类Dev

将 json 数据存储到数据库中的最佳实践

来自分类Dev

如何将DOCKER_OPTS传递到从Docker for Mac运行的Docker映像中?

来自分类Dev

枚举到最佳实践

来自分类Dev

将Docker映像克隆到dockerhub帐户

来自分类Dev

最佳实践-Git +构建自动化-将配置分开

来自分类Dev

提取源代码并在Docker映像中使用它的最佳实践

来自分类Dev

在wordpress中更改主机时配置的最佳实践是什么?

来自分类Dev

在wordpress中更改主机时配置的最佳实践是什么?

来自分类Dev

将代码放入Docker容器的最佳实践是什么?

来自分类Dev

如何直接将转储下载并导入到您的Oracle Docker映像中?

来自分类Dev

在Docker中,如果可能,我是否应该重用基础映像?

来自分类Dev

从在Docker容器中运行的JVM应用程序将日志发送到graylog的最佳实践是什么?

来自分类Dev

枚举到int最佳实践

来自分类Dev

将Docker映像配置为可执行文件

来自分类Dev

将应用程序密钥存储在Laravel中的最佳实践

来自分类Dev

是否有将UI设置存储在文件中的最佳实践?

来自分类Dev

最佳实践将数据存储在本地存储中

来自分类Dev

我应该将gRPC protobuf消息转换为DTO吗?- 最佳实践

来自分类Dev

C ++最佳实践-什么时候应该将项目分为.h和.cpp文件?

来自分类Dev

来自基本Docker映像的文件是否应该出现在派生映像中?

Related 相关文章

  1. 1

    构建/部署Docker映像的最佳实践

  2. 2

    构建/部署Docker映像的最佳实践

  3. 3

    将git存储库添加到Docker映像(工作流最佳实践)

  4. 4

    将git存储库添加到Docker映像(工作流最佳实践)

  5. 5

    在构建期间将文件复制到Docker映像中

  6. 6

    将本地项目导入到jBPM Docker映像中

  7. 7

    将Docker映像中的TLD路由到127.0.0.1

  8. 8

    在构建期间将文件复制到Docker映像中

  9. 9

    我应该将package-lock.json复制到Dockerfile中的容器映像吗?

  10. 10

    将 json 数据存储到数据库中的最佳实践

  11. 11

    如何将DOCKER_OPTS传递到从Docker for Mac运行的Docker映像中?

  12. 12

    枚举到最佳实践

  13. 13

    将Docker映像克隆到dockerhub帐户

  14. 14

    最佳实践-Git +构建自动化-将配置分开

  15. 15

    提取源代码并在Docker映像中使用它的最佳实践

  16. 16

    在wordpress中更改主机时配置的最佳实践是什么?

  17. 17

    在wordpress中更改主机时配置的最佳实践是什么?

  18. 18

    将代码放入Docker容器的最佳实践是什么?

  19. 19

    如何直接将转储下载并导入到您的Oracle Docker映像中?

  20. 20

    在Docker中,如果可能,我是否应该重用基础映像?

  21. 21

    从在Docker容器中运行的JVM应用程序将日志发送到graylog的最佳实践是什么?

  22. 22

    枚举到int最佳实践

  23. 23

    将Docker映像配置为可执行文件

  24. 24

    将应用程序密钥存储在Laravel中的最佳实践

  25. 25

    是否有将UI设置存储在文件中的最佳实践?

  26. 26

    最佳实践将数据存储在本地存储中

  27. 27

    我应该将gRPC protobuf消息转换为DTO吗?- 最佳实践

  28. 28

    C ++最佳实践-什么时候应该将项目分为.h和.cpp文件?

  29. 29

    来自基本Docker映像的文件是否应该出现在派生映像中?

热门标签

归档