Re-using environment variables in docker-compose.yml
The extends
option can be nice but it's not supported in 3.x
compose files. Other ways to go are:
Extension fields (compose file 3.4+)
If you can use 3.4+ compose files, extension fields are probably the best option:
docker-compose.yml
version: '3.4' x-common-variables: &common-variables VARIABLE: some_value ANOTHER_VARIABLE: another_value services: some_service: image: someimage environment: *common-variables another_service: image: anotherimage environment: <<: *common-variables NON_COMMON_VARIABLE: 'non_common_value'
env_file directive
docker-compose.yml
version: '3.2' services: some_service: image: someimage env_file: - 'variables.env' another_service: image: anotherimage env_file: - 'variables.env'
variables.env
VARIABLE=some_value ANOTHER_VARIABLE=another_value
.env file in project root(or variables at actual compose environment)
Variables from .env file can be referenced in service configuration:
docker-compose.yml
version: '3.2' services: some_service: image: someimage environment: - VARIABLE another_service: image: anotherimage environment: - VARIABLE - ANOTHER_VARIABLE
.env
VARIABLE=some_value ANOTHER_VARIABLE=another_value
You can use the extends directive (available in compose 1.x
and 2.x
) to have multiple containers inherit the environment
configuration from an underlying service description. For example, put the following in a file named base.yml
:
version: '2'services: base: environment: DB_URL: https://db:8443 DB_USER_NAME: admin DB_USER_PASSWORD: admin
Then in your docker-compose.yml
:
version: '2'services: container1: image: alpine command: sh -c "env; sleep 900" extends: file: base.yml service: base container2: image: alpine command: sh -c "env; sleep 900" extends: file: base.yml service: base environment: ANOTHERVAR: this is a test
Then inside of container1
, you will see:
DB_URL=https://db:8443DB_USER_NAME=adminDB_USER_PASSWORD=admin
And inside of container2
you will see:
DB_URL=https://db:8443DB_USER_NAME=adminDB_USER_PASSWORD=adminANOTHERVAR=this is a test
You can obviously use extends
for things other than the environment
directive; it's a great way to avoid duplication when using docker-compose.
You can reference local environment variables from within a docker-compose file. Assuming what you're wanting to do is make USER_NAME
the same as DB_USER_NAME
:
docker-compose.yml
version: '2'services: db: image: example/db ports: - "8443:8443" container_name: db hostname: db environment: - USER_NAME = ${USERNAME} - USER_PASSWORD = ${PASSWORD}svc: image: example/svc depends_on: - db ports: - "9443:9443" container_name: svc hostname: svc environment: - DB_URL = https://db:8443 - DB_USER_NAME = ${USERNAME} - DB_USER_PASSWORD = ${PASSWORD}
Then, run docker-compose like:
$ USERNAME="admin" PASSWORD="admin" docker-compose up
Alternately, for something more permanent, and easier to type on a recurring basis:
$ printf '%s\n%s\n' 'export USERNAME="admin"' 'export PASSWORD="admin"' >> ~/.bash_profile$ source ~/.bash_profile$ docker-compose up