**db: image: mysql:8.0 container_name: pure-mysql restart: always environment: MYSQL_ROOT_PASSWORD: 574M@gic MYSQL_DATABASE: wordpress MYSQL_USER: rich MYSQL_PASSWORD: 574magic environment: - TZ=Asia/Taipei # 修正資料庫內部時區 volumes: - /etc/localtime:/etc/localtime:ro # 同步主機時間 volumes: - ./mysql-data:/var/lib/mysql networks: - web-network有兩個 environment, 兩個 volume, 這樣寫會不會有問題**
是的,這樣寫會有很大的問題。
在 YAML 格式(docker-compose.yml)中,同一個服務下絕對不能出現重複的 Key(例如兩個 environment 和兩個 volumes)。如果這樣寫,Docker Compose 在解析時會發生以下狀況:
environment 會把第一個完全蓋掉,導致您的資料庫密碼(MYSQL_ROOT_PASSWORD 等)失效,資料庫會無法啟動或出錯。duplicate key 的語法錯誤而拒絕執行。environment 使用了「字典格式(Key: Value)」,第二個使用了「列表格式(Key=Value)」,這在同一個檔案中雖然被允許,但混用會讓排版非常混亂。請將重複的標籤合併。以下是修正後的標準寫法,統一使用乾淨的列表格式(-):
db:
image: mysql:8.0
container_name: pure-mysql
restart: always
environment:
- MYSQL_ROOT_PASSWORD=XXXXX
- MYSQL_DATABASE=wordpress
- MYSQL_USER=rich
- MYSQL_PASSWORD=xxxxx
- TZ=Asia/Taipei # 合併到同一個 environment 底下
volumes:
- /etc/localtime:/etc/localtime:ro # 合併到同一個 volumes 底下
- ./mysql-data:/var/lib/mysql
networks:
- web-network
environment: 底下有 5 個項目,全部對齊並用 開頭,中間改用 = 連接。volumes: 底下有 2 個項目,全部對齊並用 開頭。修改完成後,您可以執行 docker compose config 來檢查語法是否完全正確。如果通過,就可以直接執行 docker compose up -d 重新啟動了!
接下來,請告訴我您的 docker-compose.yml 測試重啟是否順利?若有跳出任何錯誤訊息,請隨時貼上來,我們一起解決。
有沒有 - ,有差別嗎
在 Docker Compose 中,有沒有使用 -(橫線)差別非常大,這代表了兩種完全不同的 YAML 資料結構:
這代表一個清單,項目之間沒有順序或名稱的衝突問題,可以容納重複的名字。