You can use Variable substitution with Declare default environment variables in file.
For example, my compose project structure is
C:\docker-compose
└───multiple-envs
│ .env
│ .env-dev
│ docker-compose.yml
│
├───dev-files
└───files
docker-compose.yml
, file content below, you can set ports and other values using ${ENV_VAR}
syntax. It will automatically substitute by docker compose cli.
You can instruct docker compose to show error message when the ${ENV_VAR}
not set or empty using syntax ${HOST_MYSQL_PORT:?HOST_MYSQL_PORT is not set}
, after :?
is the error message.
services:
mysqldb:
image: mysql
restart: always
ports:
- ${HOST_MYSQL_PORT:?HOST_MYSQL_PORT is not set}:3306
volumes:
- type: bind
source: ${VOLUMES_SOURCE:?VOLUMES_SOURCE is not set}
target: /mnt
read_only: true
environment:
MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD:?MYSQL_ROOT_PASSWORD is not set}
MYSQL_USER: ${MYSQL_USER:?MYSQL_USER is not set}
MYSQL_PASSWORD: ${MYSQL_PASSWORD:?MYSQL_PASSWORD is not set}
.env
file, set ENV_VAR=VAL
in file called .env
, let's say for production.
HOST_MYSQL_PORT=13306
VOLUMES_SOURCE=./files
MYSQL_ROOT_PASSWORD=p419460507
MYSQL_USER=u130085860
MYSQL_PASSWORD=p689273542
.env-dev
file, set ENV_VAR=VAL
in file called .env-dev
, let's say for development.
HOST_MYSQL_PORT=23306
VOLUMES_SOURCE=./dev-files
MYSQL_ROOT_PASSWORD=dev419460507
MYSQL_USER=dev130085860
MYSQL_PASSWORD=dev689273542
To compose in different config, specify environment file when invoke docker compose cli, --env-file multiple-envs\.env
for production or --env-file multiple-envs\.env-dev
for development.
C:\docker-compose> docker-compose --project-directory multiple-envs --env-file multiple-envs\.env up --detach
[+] Running 2/2
- Network multiple-envs_default Created 0.6s
- Container multiple-envs-mysqldb-1 Started 1.8s
C:\docker-compose> docker-compose --project-directory multiple-envs --env-file multiple-envs\.env-dev up --detach
[+] Running 1/1
- Container multiple-envs-mysqldb-1 Started 11.7s