簡體   English   中英

無法通過Travis CI上的套接字連接到本地MySQL服務器

[英]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映像中沒有像curlwget這樣的工具,因此這似乎是檢查port是否打開的唯一命令

無論選擇哪種解決方案,都必須在docker-compose updocker 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.

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