docker .env文件重用声明的变量

时间:2017-02-15 07:15:31

标签: docker environment-variables docker-compose

当我运行docker-compose构建时,我有一个.env文件用于在我的docker-machine上构建环境变量,如下所示:

COMPOSE_PROJECT_NAME=radar
ENV=production
DB_NAME=postgres
DB_USER=postgres
DB_PASS=sho1c2ov3Phezaimah7eb2Tii4ohkah8k
DB_SERVICE=postgres
DB_PORT=5432
C_FORCE_ROOT="true"
PGHOST=postgres
PGDATABASE=postgres
PGUSER=postgres
PGPASSWORD=sho1c2ov3Phezaimah7eb2Tii4ohkah8k
PGPORT=5432

如果您注意到“DB_NAME”和“PGDATABASE”之类的冗余是相同的..有没有办法避免这种情况?

1 个答案:

答案 0 :(得分:2)

Dockerfile中做这样的事情怎么样?:

ARG DB_NAME
ENV DB_NAME=${DB_NAME} PGDATABASE=${DB_NAME} ...

<强>测试

$ cat Dockerfile
FROM alpine:3.4

ARG DB_NAME
ENV DB_NAME=${DB_NAME} PGDATABASE=${DB_NAME}

RUN env

撰写文件版本2或更高版本

$ cat docker-compose.yml
version: '3' #'2' should work as well

services:
  docker-arg-env:
    build:
      context: .
      args:
        - DB_NAME
    command: env
$ cat .env
DB_NAME=world
$ docker-compose build
Building docker-arg-env
Step 1/4 : FROM alpine:3.4
 ---> 0766572b4bac
Step 2/4 : ARG DB_NAME
 ---> Running in a56be8426dd5
 ---> 4b1009ba9fad
Removing intermediate container a56be8426dd5
Step 3/4 : ENV DB_NAME ${DB_NAME} PGDATABASE ${DB_NAME}
 ---> Running in 5bbdd40e640e
 ---> 593105981a2a
Removing intermediate container 5bbdd40e640e
Step 4/4 : RUN env
 ---> Running in dadf204c7497
HOSTNAME=26ba10d264c2
SHLVL=1
HOME=/root
PGDATABASE=world
DB_NAME=world
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
PWD=/
 ---> 9632ee1e0e37
Removing intermediate container dadf204c7497
Successfully built 9632ee1e0e37
$ docker-compose up
Creating network "dockerargenv_default" with the default driver
Creating dockerargenv_docker-arg-env_1
Attaching to dockerargenv_docker-arg-env_1
docker-arg-env_1  | PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
docker-arg-env_1  | HOSTNAME=5a6b51f4ecc7
docker-arg-env_1  | DB_NAME=world
docker-arg-env_1  | PGDATABASE=world
docker-arg-env_1  | HOME=/root

如您所见,PG_NAME和PGDATABASE在构建时和运行时设置。

没有撰写

docker build --build-arg DB_NAME=world .docker run docker-arg-env:latest env会产生相同的结果。

<强>更新

如果您不能(或不想)修改Dockerfile,请尝试以下方法:

$ cat .env
hello=world
$ cat docker-compose.yml
version: '2'
services:
  app:
    environment:
      - bar=${hello}
      - foo=${hello}
    image: someimage
$ docker-compose config
version: '2'
services:
  app:
    environment:
      - bar=world
      - foo=world
    image: someimage

请参阅:https://docs.docker.com/compose/environment-variables/#the-env-file