如何自定义生命周期环境名称作为 docker-compose.yaml 的一部分。我想在 .env 文件中指定环境名称,我希望它反映在 docker-compose.yaml 中,但这没有得到正确反映
volumes:
elasticsearch-data-dev:
networks:
elasticsearch-network-dev:
答案 0 :(得分:0)
您应该能够使用环境变量来做到这一点。 Docker 在这里有一篇很好的文章:https://docs.docker.com/compose/environment-variables/
本质上,您需要定义您的 .env 文件并将您的 docker-compose.yaml
替换为正确的变量。如果需要,您可以拥有多个 .env 副本(.env.dev 或 .env.stg),但您需要将附加参数传递给 docker-compose
(--env-file
) 以指向正确的配置。
您的 .env 文件如下所示:
ES_DATA=dev-data
ES_NETWORK=dev-network
您的 yaml 文件将如下所示:
volumes:
elasticsearch-data-dev: "${ES_DATA}"
networks:
elasticsearch-network-dev: "${ES_NETWORK}"
答案 1 :(得分:0)
你可以用一个简单的 bash 脚本来实现:
version: '3'
services:
app_${MYENV}:
image: busybox
container_name: app_${MYENV}
networks:
- network_${MYENV}
networks:
network_${MYENV}:
#!/bin/bash
MYENV=${1}
COMPOSE=`eval "echo \"$(cat docker-compose.yaml)\""`
echo "$COMPOSE" | docker-compose -f - up
./run.sh dev
./run.sh prod
$ ./run.sh dev
Starting app_dev ... done
$ docker ps
f33b113f9d2b ... app_dev
$ docker network ls
436386f4eb80 demo_network_dev bridge local
答案 2 :(得分:0)
我可能会在这里结合两个不太常见的 Compose 功能。
编写一个主要的 docker-compose.yml
文件,以反映您可能希望在生产部署中运行的一组内容。不要包含任何 build:
行,但要包含对您的注册表的 image:
引用。请勿在此文件中提及任何环境。此外,请勿覆盖您创建的任何图像或卷的 container_name:
或 name:
。
# docker-compose.yml (main)
version: '3.8'
services:
elasticsearch:
image: elasticsearch:7.12.0
volumes: ['elasticsearch-data:/usr/share/elasticsearch/data']
app:
image: registry.example.com/my/app:${TAG:-latest}
environment: { ELASTICSEARCH_URL: 'http://elasticsearch:9200' }
ports: ['8000:8000']
volumes:
elasticsearch-data:
Compose 支持 project name。如果您设置 COMPOSE_PROJECT_NAME
环境变量或 docker-compose -p
命令行选项,则此名称(默认为当前目录名称)将包含在所有生成的名称中。
export COMPOSE_PROJECT_NAME=prod
docker-compose up -d
docker ps # prod_elasticsearch_1, prod_app_1
docker volume ls # prod_elasticsearch-data
您也可以使用 multiple Compose files 启动 Compose;如果这样做,它们会组合在一起,并且您可以为同一服务指定多个选项。例如,在开发中,您可能希望为数据库发布端口并指定需要构建应用程序:
# docker-compose.dev.yaml
version: '3.8'
services:
elasticsearch:
ports: ['9200:9200', '9300:9300']
# all other settings come from main docker-compose.yml
app:
build: .
然后要启动它,您需要两个 Compose 文件。
export COMPOSE_PROJECT_NAME=dev
docker-compose up -d -f docker-compose.yml -f docker-compose.dev.yml
docker ps # dev_elasticsearch_1, etc., also prod_* if still running
如果您经常这样做,您可以想象编写一个 shell 脚本包装器来处理这个问题。
#!/bin/sh
env="$1"
shift
export COMPOSE_PROJECT_NAME="$env"
if [ -f "docker-compose.$env.yml" ]; then
export COMPOSE_FILE="docker-compose.yml:docker-compose.$env.yml"
fi
exec docker-compose "$@"
./compose-env.sh dev \
up -d