6.1 環境變數的基礎
環境變數在應用程序的配置中非常重要,因為它可以動態改變服務的行為和參數,而不用修改代碼。Docker Compose 支援使用環境變數配置容器,提供靈活性和方便的管理方式。
管理環境變數最方便的方法之一是使用 .env
文件。在這節課中,我們將詳細介紹如何在 Docker Compose 中使用環境變數,包括創建和使用 .env
文件的方法。
Docker Compose 中環境變數的基礎
可以在 compose.yaml
文件中使用環境變數來參數化配置。這些變數可以定義在 .env
文件中,也可以直接寫在 compose.yaml
,或者通過命令行傳遞。
在 compose.yaml
中使用環境變數的範例:
在這個範例中,我們使用了 NGINX_VERSION
和 HOST_PORT
這些變數,這些變數的值可以在 .env
文件中設置,也可以通過命令行提供。
version: '3.8'
services:
web:
image: nginx:${NGINX_VERSION}
ports:
- "${HOST_PORT}:80"
6.2 使用 .env
檔案
1. 建立 .env
檔案
檔案 .env
放置在與 compose.yaml
相同的目錄中,包含 "鍵-值" 對,用來定義環境變數的值。每個變數都寫在新的一行中。
.env
檔案的範例:
NGINX_VERSION=latest
HOST_PORT=8080
DB_USER=admin
DB_PASSWORD=secret
2. 將 .env
檔案與 Docker Compose 整合
如果 .env
檔案位於與 compose.yaml
相同的目錄中,Docker Compose 會自動載入該檔案中的變數。
使用環境變數的 compose.yaml
檔案範例:
在這個範例中,變數 NGINX_VERSION
、HOST_PORT
、DB_USER
和 DB_PASSWORD
都來自 .env
檔案。
version: '3.8'
services:
web:
image: nginx:${NGINX_VERSION}
ports:
- "${HOST_PORT}:80"
db:
image: postgres:latest
environment:
POSTGRES_USER: ${DB_USER}
POSTGRES_PASSWORD: ${DB_PASSWORD}
6.3 傳遞變數
通過命令行傳遞變數
你可以通過命令行直接傳遞環境變數,可以在類 Unix 系統中使用 export
命令,或者在 Docker Compose 中使用參數 --env-file
。
使用 export
的例子:
export NGINX_VERSION=latest
export HOST_PORT=8080
docker compose up
使用 --env-file
的例子:
你可以使用參數 --env-file
指定一個替代的環境變數檔案。
docker compose --env-file .env.dev up
在 Docker Compose 中使用內建的環境變數
Docker Compose 支援內建的環境變數,例如 ${PWD}
,它代表當前的工作目錄。
例子:
version: '3.8'
services:
app:
image: myapp:latest
volumes:
- ${PWD}/app:/app
6.4 實踐範例
環境變數的實踐範例:
範例 1: 配置 web 伺服器和資料庫
創建一個 .env
檔案,包含 web 伺服器和資料庫的參數:
NGINX_VERSION=1.19.3
HOST_PORT=8080
DB_USER=myuser
DB_PASSWORD=mypassword
創建一個 compose.yaml
檔案,使用這些變數:
version: '3.8'
services:
web:
image: nginx:${NGINX_VERSION}
ports:
- "${HOST_PORT}:80"
volumes:
- ./nginx.conf:/etc/nginx/nginx.conf
db:
image: postgres:latest
environment:
POSTGRES_USER: ${DB_USER}
POSTGRES_PASSWORD: ${DB_PASSWORD}
volumes:
- postgres-data:/var/lib/postgresql/data
volumes:
postgres-data:
啟動 Docker Compose:
docker compose up
範例 2: 區分開發和生產環境
創建兩個 .env
檔案分別用於不同的環境:.env.dev
和 .env.prod
。
檔案 .env.dev
:
NGINX_VERSION=latest
HOST_PORT=8080
DB_USER=devuser
DB_PASSWORD=devpassword
檔案 .env.prod
:
NGINX_VERSION=1.19.3
HOST_PORT=80
DB_USER=produser
DB_PASSWORD=prodpassword
創建一個 compose.yaml
檔案,從這些檔案中使用變數:
version: '3.8'
services:
web:
image: nginx:${NGINX_VERSION}
ports:
- "${HOST_PORT}:80"
db:
image: postgres:latest
environment:
POSTGRES_USER: ${DB_USER}
POSTGRES_PASSWORD: ${DB_PASSWORD}
volumes:
- postgres-data:/var/lib/postgresql/data
volumes:
postgres-data:
啟動開發環境的 Docker Compose:
docker compose --env-file .env.dev up
啟動生產環境的 Docker Compose:
docker compose --env-file .env.prod up
GO TO FULL VERSION