Docker Compose 在卷上使用环境变量

Docker Compose 在卷上使用环境变量

有没有办法在卷部分使用 Docker Compose 环境变量?

我使用了这个配置,但它不起作用:

SampleContainer:
        image: myImage:latest
        container_name: sample
        depends_on:
            - mysql-server
        restart: always
        environment:
            - 'SERVER_NAME=jingool'
        volumes:
            - /opt/docker/myapplication/bootstrap.properties:/opt/myserver/${SERVER_NAME}/bootstrap.properties

我的问题是jingool卷上未定义目录。

我该如何解决这个问题?

答案1

您应该使用.env放置全局环境以供撰写读取的文件。

看:https://docs.docker.com/compose/environment-variables/#the-env-file有关如何使用该文件的更多信息。

其他可能的解决方案是template.yml使用 调用文件docker-compose,例如:

  • 创建一个template.yml,这是您的docker-compose.yml环境变量。
  • 假设您的环境变量位于文件“ env.sh”中
  • 将以下代码放入 sh 文件并运行它。
source env.sh; rm -rf docker-compose.yml; envsubst < "template.yml" > "docker-compose.yml";

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

示例 template.yml 文件:

SampleContainer:
        image: myImage:latest
        container_name: sample
        depends_on:
            - mysql-server
        restart: always
        volumes:
            - /opt/docker/myapplication/bootstrap.properties:/opt/myserver/${SERVER_NAME}/bootstrap.properties

样本env.sh文件:

#!/bin/bash 
export SERVER_NAME=jingool

其他选项包括:

docker-compose1.5+ 启用了变量替换:https://github.com/docker/compose/releases

最新的 Docker Compose 允许您从 compose 文件访问环境变量。因此,您可以获取环境变量,然后像这样运行 Compose:

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

docker-compose.yml然后你可以在using中引用变量${VARIABLE},如下所示:

/opt/docker/myapplication/bootstrap.properties:/opt/myserver/${SERVER_NAME}/bootstrap.properties

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

BASH方式:

这是使用 bash 脚本和.env文件的更灵活的方法。

示例.env文件:

EXAMPLE_URL=http://example.com
# Note that the variable below is commented out and will not be used:
# EXAMPLE_URL=http://example2.com 
SECRET_KEY=ABDFWEDFSADFWWEFSFSDFM

# 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

这里还有一个有趣的读物:https://modulitos.com/2016/03/lets-deploy-part-1/

相关内容