当前位置: 首页 > 知识库问答 >
问题:

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

田远
2023-03-14

我将我们的web应用程序移动到docker compose部署(Django、DRF、AngularJS)。

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

我想:

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

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

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

>

卷文件这样的东西真的存在吗(这里提到了),还是它实际上是一个绑定挂载?绑定挂载不太值得推荐,因为它们依赖于主机上的文件系统和文件路径。

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

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

  • settings.py
  • 站点\contants.js
  • admin\constants.js

以及:

我希望避免将这些文件移动到可以挂载的专用目录。

您能给我看一个带有单文件卷(非绑定装载)的docker-compose.yml示例吗。

非常感谢。

共有1个答案

邰伟彦
2023-03-14

如果不能使用环境变量,则应使用绑定挂载。如果使用命名卷,则无法访问单个文件,也无法直接编辑配置文件。

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

Newer Docker为绑定挂载提供了几种不同的语法(在撰写中,短的和长的卷:服务配置,或创建一个类型:bind命名卷)。这些基本上都是等价的,您链接到的问题中的许多答案都涉及使命名卷模拟绑定挂载。

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

services:
  app:
    build: django
    volumes:
      - ./config/django-settings.py:/app/settings.py

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

如果您将基本映像与完整的GNU工具集(Ubuntu,而不是Alpine)一起使用,那么您的容器入口点脚本也可以使用envsubt作为一个非常轻量级的模板工具(它用等效的环境变量替换$VARIABLE引用),这将帮助您支持“多选项”情况,而不是“dict类型选项”案例

一般来说,我建议将绑定挂载用于两种情况,可能是第三种情况:配置文件(操作员需要直接编辑)、日志文件(操作员需要直接读取)和持久数据存储(现有备份解决方案可以不经修改地工作;但在速度非常慢的MacOS上则不行)。命名卷可以很好地匹配持久数据情况,更好地匹配集群环境(Swarm、Kubernetes)中使用的卷,但不能直接访问。

 类似资料:
  • 我试图在docker容器上运行我的java应用程序。我在本地使用tomcat服务器,它工作正常。我是java/tomcat/docker的新手,所以我可能会错过一些非常简单的东西,但我认为只要将我的本地war文件指向就足够了。 这是我的docker-compose.yml 我可以看到文件,但我无法访问我的应用程序。我的本地主机仍然显示tomcat页面,而不是从本地安装的tomcat运行时看到的“H

  • 我正在尝试向容器提供静态IP地址。我知道我必须创建一个自定义网络。我创建它并且桥接接口在主机(Ubuntu 16. x)上。容器从此子网获取IP,但不是我提供的静态。 这是我的docker-compose.yml: 容器10.5.0.2和10.5.0.3,而不是5和6。

  • Vue.js 支持 typeScript 的推荐配置: // tsconfig.json { "compilerOptions": { // 与 Vue 的浏览器支持保持一致 "target": "es5", // 这可以对 `this` 上的数据属性进行更严格的推断 "strict": true, // 如果使用 webpack 2+ 或 rollup,可以

  • 我正在为一个断断续续变化的sqlite数据库编写一个备份脚本。现在是这样的: 目前数据库的重量仅为20MB,因此在运行并将整个文件读入内存时(在检测到更改时执行两次)不会太费力,但我不想等到这成为一个问题。 使用Bashscript术语进行这种流管道的正确方法是什么?

  • 本文向大家介绍docker容器从入门到痴迷(推荐),包括了docker容器从入门到痴迷(推荐)的使用技巧和注意事项,需要的朋友参考一下 1. docker 是什么 大家都知道虚拟机吧,windows 上装个 linux 虚拟机是大部分程序员的常用方案。公司生产环境大多也是虚拟机,虚拟机将物理硬件资源虚拟化,按需分配和使用,虚拟机使用起来和真实操作系统一模一样,当废弃不用时直接删除虚拟机文件即可回收

  • 问题内容: 弹簧配置文件示例: 和persistence.xml jpa文件: 如您所见,与jpa提供程序相关的信息已设置3次。在事务管理器bean,实体管理器工厂bean和持久性单元配置中: 但是实际上在我的项目中,我仅使用提供程序配置了持久性单元。而且有效。 所以我的问题是提供商,方言和卖方选项之间有什么区别?我必须全部设置它们,还是可以跳过其中一些?例如,我可以设置为EntityManger