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

今天我使用的是基本的docker run命令,该命令包含在我自己的脚本中。 有没有一种方法来实现它与撰写,没有任何这样的bash包装?

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

当前回答

要添加一个env变量,你可以定义一个env_file(让我们称之为var.env):

ENV_A=A
ENV_B=B

并将其添加到docker组合清单服务。此外,您可以直接使用environment定义env变量。

例如在docker-compose.yaml中:

version: '3.8'
services:
  myservice:
    build:
      context: .
      dockerfile: ./docker/Dockerfile.myservice
    image: myself/myservice
    env_file:
     - ./var.env
    environment:
     - VAR_C=C
     - VAR_D=D
    volumes:
     - $HOME/myfolder:/myfolder
    ports:
     - "5000:5000"

更多最新信息请点击这里:https://docs.docker.com/compose/environment-variables/

其他回答

这是为Docker v20编写的,使用Docker compose v2命令。

I was having a similar roadblock and found that the --env-file parameter ONLY works for docker compose config command. On top of that using the docker compose env_file variable, still forced me to repeat values for the variables, when wanting to reuse them in other places than the Dockerfile such as environment for docker-compose.yml. I just wanted one source of truth, my .env, with the ability to swap them per deployment stage. So here is how I got it to work, basically use docker compose config to generate a base docker-compose.yml file that will pass ARG into Dockerfile's.

。local。这是你的。env,我把我的。env分成了不同的部署。

DEVELOPMENT=1
PLATFORM=arm64

docker-compose.config。yml -这是我的核心docker合成文件。

services:
  server:
    build:
      context: .
      dockerfile: docker/apache2/Dockerfile
      args:
        - PLATFORM=${PLATFORM}
        - DEVELOPMENT=${DEVELOPMENT}
    environment:
      - PLATFORM=${PLATFORM}
      - DEVELOPMENT=${DEVELOPMENT}

现在不幸的是,我需要传递两次变量,一次用于Dockerfile,另一次用于environment。然而,它们仍然来自单一来源。local。env这样至少我不需要重复值。

然后,我使用docker compose config生成一个半成品docker-compose.yml。这让我传入我的同伴override docker-compose.local。Yml表示发生最终部署的地方。

docker compose --env-file=.local.env -f docker-compose.config.yml config > docker-compose.yml

这将允许我的Dockerfile访问.env变量。

FROM php:5.6-apache

# Make sure to declare after FROM
ARG PLATFORM
ARG DEVELOPMENT

# Access args in strings with $PLATFORM, and can wrap i.e ${PLATFORM}
RUN echo "SetEnv PLATFORM $PLATFORM" > /etc/apache2/conf-enabled/environment.conf
RUN echo "SetEnv DEVELOPMENT $DEVELOPMENT" > /etc/apache2/conf-enabled/environment.conf

然后从docker-compose中传递.env变量。yml到Dockerfile,然后传递到我的Apache HTTP服务器,它传递到我的最终目的地,PHP代码。

我的下一步是从部署阶段传入我的docker合成重写。

docker-compose.local。yml -这是我的docker重写。

services:
  server:
    volumes:
      - ./localhost+2.pem:/etc/ssl/certs/localhost+2.pem
      - ./localhost+2-key.pem:/etc/ssl/private/localhost+2-key.pem

最后,运行docker compose命令。

docker compose -f docker-compose.yml -f docker-compose.local.yml up --build

请注意,如果你在你的.env文件中改变了任何东西,你将需要重新运行docker compose config并添加——build for docker compose up。因为构建是缓存的,所以影响很小。

因此,对于我的最后一个命令,我通常运行:

docker compose --env-file=.local.env -f docker-compose.config.yml config > docker-compose.yml; docker compose --env-file=.local.env -f docker-compose.yml -f docker-compose.local.yml up --build 

你不能……然而。但这是另一种选择,像码头作曲家一样思考。yml发电机:

https://gist.github.com/Vad1mo/9ab63f28239515d4dafd

基本上是一个替换变量的shell脚本。你也可以使用Grunt任务在CI进程结束时构建docker合成文件。

我有一个简单的bash脚本,我为此创建,这只是意味着在使用之前在你的文件上运行它: https://github.com/antonosmond/subber

基本上只要创建你的合成文件使用双花括号表示环境变量,例如:

app:
    build: "{{APP_PATH}}"
ports:
    - "{{APP_PORT_MAP}}"

双花括号中的任何内容都将被同名的环境变量替换,因此如果我设置了以下环境变量:

APP_PATH=~/my_app/build
APP_PORT_MAP=5000:5000

运行subber docker-compose。Yml生成的文件看起来像这样:

app:
    build: "~/my_app/build"
ports:
    - "5000:5000"

我最终在我的deploy.sh脚本中使用“sed”来完成这一点,尽管我的要求略有不同,因为Docker - Compose是由Terrafom调用的:通过Azure应用程序服务的Terraform脚本将变量传递给Docker Compose

eval "sed -i 's/MY_VERSION/$VERSION/' ../docker-compose.yaml"

cat ../docker-compose.yaml

terraform init 
terraform apply -auto-approve \
    -var "app_version=$VERSION" \
    -var "client_id=$ARM_CLIENT_ID" \
    -var "client_secret=$ARM_CLIENT_SECRET" \
    -var "tenant_id=$ARM_TENANT_ID" \
    -var "subscription_id=$ARM_SUBSCRIPTION_ID"

eval "sed -i 's/$VERSION/MY_VERSION/' ../docker-compose.yaml"

以下代码适用于docker-compose 3.x 在容器内设置环境变量

方法- 1直接法

web:
  environment:
    - DEBUG=1
      POSTGRES_PASSWORD: 'postgres'
      POSTGRES_USER: 'postgres'

方法- 2“。env”文件

在docker-compose.yml文件所在的位置创建一个.env文件

$ cat .env
TAG=v1.5
POSTGRES_PASSWORD: 'postgres'

你的合成文件会是这样的

$ cat docker-compose.yml
version: '3'
services:
  web:
    image: "webapp:${TAG}"
    postgres_password: "${POSTGRES_PASSWORD}"