无法通过Travis CI上的套接字连接到本地MySQL服务器

时间:2018-08-12 14:03:12

标签: mysql sql docker docker-compose 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

docker-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文件?

1 个答案:

答案 0 :(得分:0)

之所以会这样,是因为在执行以下命令时,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文件中的healthcheck用于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'(十六进制的0)绑定在IPv4或IPv6上,则运行状况检查中使用的:0CEA命令返回:3306(这意味着MySQL已准备好接受连接)。由于curl图片中没有像wgetmysql:5.7这样的工具,因此这似乎是检查端口是否打开的唯一命令

无论选择哪种解决方案,都必须在docker-compose updocker exec之间添加一条命令以等待繁忙,例如以下使用healthcheck(我更喜欢的解决方案)的第三种解决方案: / p>

while [ "$(docker inspect -f '{{.State.Health.Status}}' travistest_db_1)" != "healthy" ];
do
    sleep 1
done