docker.env文件重复使用声明的variables

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

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”这样的冗余是一样的..有没有办法避免这种情况?

Dockerfile做这样的事情呢?

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

testing

 $ 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在构build时间和运行时期间被设置。

没有撰写

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