如何自定义生命周期环境名称作为 docker-compose.yaml 的一部分

时间:2021-03-31 10:01:06

标签: docker-compose

如何自定义生命周期环境名称作为 docker-compose.yaml 的一部分。我想在 .env 文件中指定环境名称,我希望它反映在 docker-compose.yaml 中,但这没有得到正确反映

volumes:
  elasticsearch-data-dev:

networks:
  elasticsearch-network-dev:

3 个答案:

答案 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 脚本来实现:

docker-compose.yaml

version: '3'

services:
  app_${MYENV}:
    image: busybox
    container_name: app_${MYENV}
    networks:
    - network_${MYENV}
    
  networks:
    network_${MYENV}:

运行.sh

#!/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