簡體   English   中英

為什么我的 docker-entrypoint-initdb.d 腳本(在 docker-compose.yml 中指定)沒有被執行來初始化一個新的 MySQL 實例?

[英]Why isn't my docker-entrypoint-initdb.d script (as specified in docker-compose.yml) executed to initialize a fresh MySQL instance?

我從這個答案中發現了/docker-entrypoint-initdb.d目錄,還閱讀了“如何使用這個圖像”MySQL 文檔的“初始化一個新實例”部分。 但是當我在包含下面docker-compose.yml文件的目錄中運行docker-compose up時,我的數據庫沒有初始化。


services:

# Use root/root as MySQL user/password credentials
  db:
    image: mysql
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: root
      MYSQL_USER: root
      MYSQL_PASSWORD: root
      MYSQL_DATABASE: db
    volumes:
      - ./mysql/data:/var/lib/mysql
      - ./mysql/init:/docker-entrypoint-initdb.d/:ro

  adminer:
    image: adminer
    restart: always
    ports:
      - 8080:8080

我確認./mysql/init目錄包含一個名為init.sql的文件。 我確認在我清空./mysql/data目錄並運行./mysql/data docker-compose up ,創建了一個db數據庫。 但是沒有填充數據庫,除非我在 Adminer 中手動執行腳本。 (我單擊“導入”,然后選擇文件並按“執行”按鈕。)

我在運行init.sql docker-compose up后在控制台輸出中查找消息,這些消息表明嘗試運行init.sql並且找不到任何東西。

更新: MySQL 版本為 8.0.19。

魔鬼藏在細節里……

您的環境變量中有root的雙重定義。 root用戶默認使用來自MYSQL_ROOT_PASSWORD密碼創建。 然后您要求創建第二個“普通”用戶......使用完全相同的名稱和密碼(即使用MYSQL_USERMYSQL_PASSWORD

如果你仔細查看你的啟動日志,你會看到一個錯誤

db_1       | ERROR 1396 (HY000) at line 1: Operation CREATE USER failed for 'root'@'%'

這實際上會停止進一步處理docker-entrypoint-initdb.d中的 init 文件,並繼續進行其余的映像啟動過程(即在臨時服務器上初始化后重新啟動 mysql)。

只需將MYSQL_USERMYSQL_PASSWORD放在您的環境變量中,或者設置一個不同於root用戶,您將立即看到您的 init 文件已處理(不要忘記再次清空您的數據目錄)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM