![](/img/trans.png)
[英]Error when connecting Mysql thru PDO, but not when using basic mysqli commands SQLSTATE[HY000] [2002]
[英]Docker - MySQL commands within Dockerfile using RUN (ERROR 2002)
我正在使用 Docker 創建一個以 mysql 作為基礎映像的 dockerfile:
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 在我嘗試創建數據庫的步驟中失敗,它沒有完成構建並且我收到此錯誤:
錯誤 2002 (HY000): 無法通過套接字 '/var/run/mysqld/mysqld.sock' 連接到本地 MySQL 服務器
當我刪除 #create database run 命令時,dockerfile 將構建並且我能夠從該映像運行容器。 我知道這不是mysql服務器的問題,因為我可以進入容器並成功手動運行mysql命令並且服務狀態正在運行。
在文件中使用環境變量,即 MYSQL_ROOT_PASSWORD 也允許我成功創建數據庫,但這僅適用於單個數據庫,我需要能夠使用 mysql 命令進行查詢,例如創建其他數據庫/分配用戶等.
這可能是因為我需要指定 docker 容器的主機和端口,但這仍然不允許我連接
RUN mysql -u root -ppassword -h 127.0.0.1 -P 3308 -e "CREATE DATABASE dbname"
奇怪的是,這樣做也經常使容器崩潰並使其處於每次我嘗試再次重新啟動它時它會在啟動時再次崩潰的狀態。
我認為問題可能在於服務尚未在用於構建 Dockerfile 的容器中啟動。
在 Dockerfile 中使用以下給出的命令:
RUN service mysql restart && echo 'CREATE DATABASE db_name;' | mysql -uroot -
pYOUR_ROOT_PASSWORD
遇到了同樣的問題:當啟動容器並運行一組RUN
指令或/docker-entrypoint-initdb.d/
中的.sh
或.sql
腳本時,無法建立與數據庫服務器的連接。
我通過@wpalmer 在 mysql-image 上的評論找到了解決方案:
入口點運行的初始化腳本,在內部使用變量“${mysql[@]}”來調用mysql(例如,在加載放置在docker-entrypoint-initdb.d目錄中的.sql文件時。任何.sh文件由入口點處理的它們被“采購”它們包括在內,這意味着該變量可供任何運行的 .sh 文件使用)。
那么這對你mysql
什么,而不是像在
RUN mysql -u root -ppassword -e "CREATE DATABASE dbname"
改用占位符:
RUN "${mysql[@]}" -e "CREATE DATABASE dbname"
您可以嘗試構建其他圖像並從那里運行創建數據庫。 docker-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 "$@"
您可以將查詢作為 .sql 文件復制到“/docker-entrypoint-initdb.d”容器目錄中。 mysql 將在啟動容器后執行它們
COPY ./init/db.sql /docker-entrypoint-initdb.d/
閱讀官方文檔https://hub.docker.com/_/mysql?tab=description&page=1初始化一個新實例
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.