2016-02-18 47 views
3

我使用泊塢窗來創建MySQL作爲基礎映像dockerfile:泊塢窗 - 使用RUN(ERROR 2002)內Dockerfile的MySQL命令

FROM mysql 
#set root pass 
ENV MYSQL_ROOT_PASSWORD password 
#update linux 
RUN apt-get update 
#create database 
RUN mysql -u root -ppassword -e "CREATE DATABASE dbname" 
#install vim 
RUN apt-get install vim -y 

上一步,我嘗試創建一個數據庫dockerfile失敗,它沒有完成建設,我收到此錯誤:

ERROR 2002(HY000):無法通過套接字連接到本地MySQL服務器 '/var/run/mysqld/mysqld.sock'

當我刪除#create數據庫時dockerfile將構建的ase運行命令,我可以從該映像運行容器。我知道這不是mysql服務器的問題,因爲我可以輸入容器併成功手動運行mysql命令並且服務狀態正在運行。

使用環境變量即MYSQL_ROOT_PASSWORD內的文件,也可以讓我成功地創建一個數據庫,但這隻會用一個單一的數據庫工作,我需要能夠使用mysql命令進行查詢,如創建額外的數據庫/用戶分配等

這可能是因爲我需要指定泊塢窗容器的主機和端口,但是這仍然沒有允許我連接

RUN mysql -u root -ppassword -h 127.0.0.1 -P 3308 -e "CREATE DATABASE dbname" 

奇怪的是,這樣做還經常死機容器並將其置於每次啓動時都會再次崩潰的狀態在我嘗試重新啓動它。

回答

1

有同樣的問題:當啓動容器和運行一組RUN指令,或.sh.sql腳本/docker-entrypoint-initdb.d/可能無法建立與數據庫服務器的連接。

我發現了MySQL像上解決由comment of @wpalmer

The init scripts run by the entrypoint, internally, use the variable "${mysql[@]}" to call mysql (for example, when loading .sql files placed in the docker-entrypoint-initdb.d directory. Any .sh files which are processed by the entrypoint are included by "sourcing" them, meaning that variable is available for use by any .sh files which are run).

那麼這意味着什麼,而不是提供與用戶的普通mysql命令你,傳遞等。在

RUN mysql -u root -ppassword -e "CREATE DATABASE dbname" 

使用佔位符代替:

RUN "${mysql[@]}" -e "CREATE DATABASE dbname" 
3

我認爲這個問題可能是服務尚未開始用於構建Dockerfile的容器內。

+0

我通過複製的MySQL Dockerfile的內容,並增加我的查詢到運行命令的末尾嘗試這種解決方案,這個成功,但任何容器構建我在創建時使用此映像也會崩潰。 – user3495336

+0

默認情況下,您構建的容器不會運行所有服務。所以一旦你建立了容器,你應該再次啓動mysqld(在該容器中)。 –

+0

mysqld已經在運行,因爲它已被設置爲在啓動時運行 – user3495336

0

您可以嘗試構建其他映像並從那裏運行創建數據庫。泊塢窗,compose.yml的 例

web: 
    build: web 
    links: 
    - "db:db.local" 
    entrypoint: entrypoint.sh 

db: 
    build: db 
    environment: 
    MYSQL_ROOT_PASSWORD: password 
    command: mysqld 

對於entrypoint.sh你把這樣的事情:

#!/bin/sh 

#this is a hack to wait until the DB image is up and the port is open 
until mysqladmin -u root -ppassword -e -h db.local ping; do 
    echo "$(date) - waiting for mysql" 
    sleep 3 
done 

if ! mysql -u root -ppassword -e -h db -e 'use dbname'; then 
    mysql -u root -ppassword -e "CREATE DATABASE dbname" 
fi 

exec "[email protected]"