docker compose 文件中可以有变量吗? (不是环境变量)

问题描述 投票:0回答:1
services:
  backend:
    environment:
      DB_NAME: ${DB_NAME:-SOME_DB_NAME}

  postgres:
    image: postgres:
    environment:
      POSTGRES_DB: ${DB_NAME:-SOME_DB_NAME}

我有一个 docker compose 文件,我想为未设置的环境变量设置默认值,有什么方法可以确保有人不会意外更改其中一个而不是另一个的默认值?

理想情况下,我希望能够在同一个文件中包含变量,例如

vars:
   DEFAULT_DB_NAME: SOME_DB_NAME

# USE vars: to change default config, don't touch below
services:
 backend:
   environment:
     DB_NAME: ${DB_NAME:-DEFAULT_DB_NAME}

 postgres:
   image: postgres:
   environment:
     POSTGRES_DB: ${DB_NAME:-DEFAULT_DB_NAME}

或者类似的东西,但我在 docker compose 文档中找不到任何内容。

docker docker-compose yaml
1个回答
0
投票

在此空间中您可以做的最简单的事情是创建一个保存默认值的

.env
文件

# .env
DB_NAME=some_db_name
services:
  backend:
    environment:
      DB_NAME:

  postgres:
    image: postgres:
    environment:
      POSTGRES_DB: ${DB_NAME}

(我故意没有为

backend
容器的
DB_NAME
提供值。此语法从包含环境中传递
$DB_NAME
,该环境将默认为
.env
文件中的内容。)

如果您想提供不同的值,shell 环境会覆盖

.env
文件。

DB_NAME=other_db_name docker-compose up -d

Compose“规范”文件格式或其任何前身中没有用于在 Compose 文件本身中声明默认值的语法。 最接近的是使用 YAML 片段的尴尬语法,但这只能在 YAML 级别替换(技术上共享)整个 YAML 字符串值,它根本无法替换字符串的一部分或参与环境变量插值。 原则上这样的东西可能会起作用

services:
  backend:
    environment:
      DB_NAME: &dbname ${DB_NAME:-some_db_name}

  postgres:
    image: postgres:
    environment:
      POSTGRES_DB: *dbname

而且您只需要编写一次默认值,但我发现 YAML 锚语法有点令人困惑,通常不会推荐它。 Compose 确实支持带有 YAML 锚点的任意顶级扩展块,这可能最接近您想要的

version: "3.8"  # minimum versions 2.1, 3.4, 4.0+composespecification
x-vars:
  - &dbname ${DB_NAME:-some_db_name}

services:
  backend:
    environment:
      DB_NAME: *dbname

  postgres:
    image: postgres:
    environment:
      POSTGRES_DB: *dbname

但这并不是真正的标准语法,如果您最终执行诸如将 Compose 设置拆分为多个文件之类的操作,它将无法正常工作。

© www.soinside.com 2019 - 2024. All rights reserved.