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

如何在docker-compose中使用环境变量?

赵兴朝
2023-03-14

我希望能够在docker compose中使用env变量。yml,值在docker compose up时传入。这就是一个例子。

我今天用基本的docker run命令来做这件事,它包含在我自己的脚本中。有没有一种方法可以在没有任何bash包装器的情况下用compose实现它?

proxy:
  hostname: $hostname
  volumes:
    - /mnt/data/logs/$hostname:/logs
    - /mnt/data/$hostname:/data

共有3个答案

柴博
2023-03-14
  1. 创建模板。yml,这是您的docker compose。yml与环境变量
  2. 假设您的环境变量位于“env”文件中。sh'
  3. 将以下代码放入sh文件并运行

源env.sh;rm-rfdocker-compose.yml;envsubst

将使用环境变量的正确值生成一个新文件< code>docker-compose.yml。

示例template.yml文件:

oracledb:
        image: ${ORACLE_DB_IMAGE}
        privileged: true
        cpuset: "0"
        ports:
                - "${ORACLE_DB_PORT}:${ORACLE_DB_PORT}"
        command: /bin/sh -c "chmod 777 /tmp/start; /tmp/start"
        container_name: ${ORACLE_DB_CONTAINER_NAME}

示例 env.sh 文件:

#!/bin/bash 
export ORACLE_DB_IMAGE=<image-name> 
export ORACLE_DB_PORT=<port to be exposed> 
export ORACLE_DB_CONTAINER_NAME=ORACLE_DB_SERVER
常茂
2023-03-14

docker compose现在似乎对文件中的默认环境变量具有本地支持。

您需要做的就是在名为<code>的文件中声明变量。env,它们将在docker-compose.yml中提供。

例如,对于内容为. env的文件:

MY_SECRET_KEY=SOME_SECRET
IMAGE_NAME=docker_image

您可以在dockercompose中访问变量。yml或将它们转发到容器中:

my-service:
  image: ${IMAGE_NAME}
  environment:
    MY_SECRET_KEY: ${MY_SECRET_KEY}
璩浩广
2023-03-14

Docker-compose 1.5 启用了变量替换:https://github.com/docker/compose/releases

最新的Docker Com的允许您访问环境变量从您的com的文件。因此,您可以源代码您的环境变量,然后运行Com的方式如下:

set -a
source .my-env
docker-compose up -d

例如,假设我们有以下<code>。我的env文件:

POSTGRES_VERSION=14

(或者在调用< code>docker-compose时通过命令行参数传递它们,比如:< code > POSTGRES _ VERSION = 14 docker-compose up-d )

然后,您可以使用< code>${VARIABLE}语法引用< code>docker-compose.yml中的变量,如下所示:

db:
  image: "postgres:${POSTGRES_VERSION}"

以下是来自文档的更多信息,摘自:https://docs . docker . com/compose/compose-file/# variable-substitution

使用此配置运行docker-compose时,compose会在shell中查找POSTGRES_VERSION环境变量,并将其值代入。对于本例,Compose在运行配置之前将映像解析为postgres:9.3。

如果未设置环境变量,则使用空字符串替换Com的值。在上面的示例中,如果未设置POSTGRES_VERSION,则图像选项的值为postgres:。

$VARIABLE和${VARIABLE}语法都受支持。不支持扩展的shell样式特性,例如${VARIABLE default}和${VARIABLE/foo/bar}。

如果您需要在配置值中添加一个美元符号,请使用双美元符号($$)。

该功能已添加到此拉请求中。

如果你想避免任何bash包装器,或者必须显式地获取env vars文件(如上所示),那么你可以将一个--env-file标志传递给docker-compose命令,其中包含你的env var文件的位置:https://docs.docker.com/compose/env-file/

然后,您可以在docker-compse命令中引用它,而无需显式获取它:

docker-compose --env-file .my-env  up -d 

如果没有传递< code> - env-file标志,默认的env变量文件将是< code >。环境

对于这种方法,请注意以下警告:

运行时环境中存在的值总是覆盖在. env文件中定义的值。同样,通过命令行参数传递的值也优先。

因此,请小心任何可能覆盖--env文件中定义的envvars!

我注意到Docker对环境变量的自动处理会引起混乱。与其在Docker中处理环境变量,不如让我们回到基础,比如bash!下面是一个使用bash脚本和< code >的方法。env文件,具有一些额外的灵活性来演示env变量的效用:

POSTGRES_VERSION=14
# Note that the variable below is commented out and will not be used:
# POSTGRES_VERSION=15

# You can even define the compose file in an env variable like so:
COMPOSE_CONFIG=my-compose-file.yml
# You can define other compose files, and just comment them out
# when not needed:
# COMPOSE_CONFIG=another-compose-file.yml

然后在同一个目录中运行这个bash脚本,它应该正确部署所有内容:

#!/bin/bash

docker rm -f `docker ps -aq -f name=myproject_*`
set -a
source .env
cat ${COMPOSE_CONFIG} | envsubst | docker-compose -f - -p "myproject" up -d

只需使用常用的bash语法(即< code>${POSTGRES_VERSION})在compose文件中引用env变量,从< code >中插入< code>POSTGRES_VERSION。环境 文件)。

虽然这个解决方案涉及bash,但有些人可能更喜欢它,因为它有更好的关注点分离。

请注意,COMPOSE_CONFIG在我的 .env 文件中定义并在我的 bash 脚本中使用,但您可以轻松地将 {$COMPOSE_CONFIG} 替换为 bash 脚本中的 my-compose-file.yml

另请注意,我通过使用“myproject”前缀命名所有容器来标记此部署。您可以使用所需的任何名称,但它有助于识别容器,以便以后可以轻松引用它们。假设容器是无状态的,因此此脚本将根据 .env 文件参数和组合 YAML 文件快速删除并重新部署容器。

由于这个答案似乎很流行,我写了一篇博客文章,更深入地描述了我的Docker部署工作流:https://modulitos.com/blog/lets-deploy-part-1/当您为部署配置(如Nginx配置、LetsEncrypt证书和链接容器)添加更多复杂性时,这可能会有所帮助。

 类似资料:
  • 问题内容: 我希望能够在docker-compose.yml中使用env变量,并在docker-compose时传入值。这就是例子。我今天使用基本的docker run命令来执行此操作,该命令包装在我自己的脚本中。没有任何这样的bash包装器,有没有办法通过compose实现它? 问题答案: 创建一个,这是您的with环境变量。 假设您的环境变量在文件“ env.sh”中 将以下代码放入sh文件中

  • 问题内容: 我正在尝试设置一个postgres容器,并希望使用以下命令设置postgres登录名: 所以我像这样创建了docker-compose.yml 我还尝试了将环境变量声明为db部分的其他语法: 但是这些选项似乎都不起作用,因为无论出于什么原因,无论何时我尝试使用各种连接字符串连接到postgres数据库: 与抱怨没有用户数据库相反,它们都给我身份验证失败。 问题答案: 您收到的身份验证错

  • 问题内容: 是否可以重用在多个容器之间共享的环境变量以避免重复,如本示例所示: 问题答案: 该选项可能是好的,但它不支持在撰写文件。其他走的方式是: 扩展名字段(撰写文件3.4+) 如果可以使用3.4+组成文件,则扩展名字段可能是最佳选择: docker-compose.yml env_file指令 docker-compose.yml variables.env * 项目根目录中的 *.env

  • 问题内容: 使用v2,可以简单地设置环境变量: 完整文件为: 但是,如何转义不是纯字符串的环境变量? 我试过了: 错误:yaml.parser.ParserError:解析“ ./docker-compose.yml”第6行中的块映射时,预期第9列,但在“ ./docker-compose.yml”第6行中找到了“}”。第92栏 问题答案: 环境变量(包括姓名), 有单或双引号内被完全包裹 :或

  • 这个码头商。yml: 使用这个。env文件(它位于根文件夹中,如docker-compose.yml和Dockerfile): 和节点服务器启动中的以下代码: 我真的更喜欢使用第一种或第二种方法 docker版本:18.06.1-CE docker-compose版本:1.19.0

  • 问题内容: 我有一个Dockerized应用程序,我想在代理和非代理主机环境中运行。我正试图通过将普通环境变量(例如http_proxy)复制到容器中(如果且仅当它们存在于主机中时)来解决此问题。 我可以通过跑步获得90%的路程 在顶层脚本中,然后在我的docker-compose.yml中包含: 这会将主机的环境代理变量(如果有)复制到服务器容器中,并且在容器运行时可用这些变量的意义上起作用,换