2017-02-15 17 views
2

Когда я бегу докер-билд создания сообщения У меня есть файл .env который будет использоваться для построения переменных среды в моей Докер-машине, как это:Docker .env повторное использование файла объявленным переменным

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» одинакова. Есть ли способ избежать этого?

ответ

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 

Compose File Version 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 установлены во время сборки времени и времени выполнения.

Без Compose:

docker build --build-arg DB_NAME=world . и docker run docker-arg-env:latest env тот же результат.

Update

Если вы не можете (или не хотите) модифицировать 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

+0

Вы пробовали? К сожалению, это не работает на меня –

+0

У меня сейчас ;-) Пример включен в ответ. – Martin

+0

О, я совсем забыл, что вы использовали 'docker-compose build'. Должен был прочитать вопрос еще раз. – Martin