向 Docker 容器提供配置文件的推荐方式

wav*_*der 5 django volumes docker docker-compose

我正在将我们的 Web 应用程序转移到 docker-compose 部署(Django、DRF、AngularJS)。

Docker 现在看起来很稳定,一切进展顺利。

我想要:

  • 与您确认我正在遵循有关应用程序配置文件的最佳实践
  • 知道“卷文件”是否实际上是绑定挂载,不推荐这样做

我已经设法使用环境变量和从 Djangosettings.py文件读取的 docker-compose 机密,并且它可以工作。缺点是环境变量仅限于简单的字符串,并且在发送 Python 列表、字典等时可能会带来一些转义挑战。我们还必须定义和维护大量环境变量,因为我们的 Web 应用程序安装在很多地方并且具有高度可配置性。

在前端(AngularJS),我们有两个constants.js文件和 nginx conf。我在 Dockerfile 中使用过CMD ["/start.sh"]并有一些sed命令。但这看起来真的很黑客,这也意味着我们必须定义和维护相当多的环境变量。

  1. 对于这些配置文件使用 Docker 卷是个好主意吗?

  2. “卷文件”之类的东西是否确实存在此处提到)或者它实际上是绑定安装?绑定挂载不太推荐,因为它们依赖于主机上的文件系统和文件路径。

Volumes 文档简要提到了文件:“文件或目录在容器中安装的路径”,但没有详细介绍。

我们的网络应用程序现在有简单的配置文件:

  • settings.py
  • site\contants.js
  • admin\constants.js

和:

  1. 我想避免将这些文件移动到可以安装的专用目录。

  2. 您能给我展示一个带有单个文件卷(不是绑定安装)的示例 docker-compose.yml 吗

谢谢

Dav*_*aze 8

如果您无法使用环境变量,那么您应该使用绑定安装。如果您使用命名卷,则无法访问单个文件,也无法直接编辑配置文件。

命名卷始终是整个目录,并且不能从主机直接访问。不存在“卷文件”这样的东西(您的链接问题完全与绑定安装有关,有些使用命名卷语法),并且无法从命名卷中安装单个文件。

较新的 Docker 有几种不同的绑定安装语法(在 Compose 中,服务配置和 volumes:服务配置,或创建type: bind命名卷)。这些基本上都是等效的,并且您链接的问题中的许多答案都涉及使命名卷模拟绑定安装。

Docker Compose 支持相对路径,因此不必担心绑定挂载的主机路径不可跨系统移植。文件的基本片段docker-compose.yml可能包括:

services:
  app:
    build: django
    volumes:
      - ./config/django-settings.py:/app/settings.py
Run Code Online (Sandbox Code Playgroud)

在此示例中,我建议使用一个包含配置文件的(部署时)config目录,但这是一个任意选择;如果您想从应用程序源树绑定安装./django/settings.py到映像中的内容以便能够直接编辑它,这也是一个有效的选择。您可以将此树签入源代码管理,无论在何处签出,它仍然可以工作。

如果您使用具有完整 GNU 工具集(Ubuntu,而不是 Alpine)的基础映像,那么您的容器入口点脚本还可以使用envsubst作为非常轻量级的模板工具(它$VARIABLE用等效的环境变量替换引用),这将帮助您支持“许多选项”情况,但不支持“字典类型选项”情况。

一般来说,我建议针对两种情况甚至第三种情况使用绑定安装:对于配置文件(操作员需要直接编辑它们),对于日志文件(操作员需要直接读取它们),也许对于持久数据存储(您现有的备份解决方案无需修改即可工作;但不适用于 MacOS,因为速度非常慢)。命名卷可以很好地匹配持久数据情况,并且更好地匹配您在集群环境(Swarm、Kubernetes)中使用的卷,但无法直接访问。