有没有办法在卷部分使用 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-compose
1.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/