[英]Mysql with docker: Can't connect to local MySQL server through socket
[英]Can't connect to local MySQL server through socket on Travis CI
我正在Travis CI上實施自動化測試。 以下是docker-compose.yml
和.travis.yml
文件。
.travis.yml
dist: trusty
language: php
sudo: required
group: edge
php:
- '5.6'
- '7.1'
services:
- docker
- mysql
git:
quiet: true
before_install:
- sudo chmod +x docker-compose.yml
before_script:
script:
- docker-compose up -d
- docker exec -i travistest_db_1 mysql -uwordpress -pwordpress wordpress < wordpress.sql
泊塢窗,compose.yml
version: '3.3'
services:
db:
image: mysql:5.7
volumes:
- ~/db_data:/var/lib/mysql
restart: always
environment:
MYSQL_ROOT_PASSWORD: wordpress
MYSQL_DATABASE: wordpress
MYSQL_USER: wordpress
MYSQL_PASSWORD: wordpress
wordpress:
image: wordpress:latest
volumes:
- ~/wordpress_data:/var/www/html
depends_on:
- db
ports:
- "8004:80"
restart: always
environment:
WORDPRESS_DB_HOST: db:3306
WORDPRESS_DB_USER: wordpress
WORDPRESS_DB_PASSWORD: wordpress
phpmyadmin:
image: phpmyadmin/phpmyadmin:latest
environment:
MYSQL_USER: root
MYSQL_ROOT_PASSWORD: wordpress
ports:
- "8011:80"
volumes:
db_data:
當我嘗試觸發SQL查詢時,它將引發以下錯誤:
mysql: [Warning] Using a password on the command line interface can be insecure. ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (2) read unix @->/var/run/docker.sock: read: connection reset by peer
我已經嘗試調試了幾個小時,但是還沒有運氣,有沒有人曾經遇到過這個問題並設法解決這個問題?
有導入SQL文件的替代方法嗎?
發生這種情況是因為,在執行以下命令時,MySQL數據庫尚未初始化:
docker exec -i travistest_db_1 mysql -uwordpress -pwordpress wordpress < wordpress.sql
運行。 您需要臨時使用此命令,並且有很多方法可以執行此操作:
[Note] mysqld: ready for connections.
出現在travistest_db_1
等到以下命令:
docker inspect -f \\ '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}:3306' \\ travistest_db_1
返回0
退出狀態(表示端口3306已打開並允許連接)
用健康檢查在您的docker-compose.yml
文件,您的db
服務(你可以根據自己的需要配置參數):
healthcheck: test: "cat /proc/net/tcp /proc/net/tcp6 | grep ':0CEA'" interval: 10s timeout: 5s retries: 5
然后等到:
docker inspect -f '{{.State.Health.Status}}' \\ travistest_db_1
恢復healthy
。 cat /proc/net/tcp /proc/net/tcp6 | grep ':0CEA'
如果端口:0CEA
(十六進制的:3306
)綁定在IPv4或IPv6上,則運行狀況檢查中使用的cat /proc/net/tcp /proc/net/tcp6 | grep ':0CEA'
命令返回0
。 由於在mysql:5.7
映像中沒有像curl
或wget
這樣的工具,因此這似乎是檢查port是否打開的唯一命令
無論選擇哪種解決方案,都必須在docker-compose up
和docker exec
之間添加命令以進行繁忙的等待,例如以下第三個帶有healthcheck
(我更喜歡的解決方案)的解決方案:
while [ "$(docker inspect -f '{{.State.Health.Status}}' travistest_db_1)" != "healthy" ];
do
sleep 1
done
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.