无法通过travis ci上的套接字连接到本地mysql服务器

np8igboo  于 2021-06-23  发布在  Mysql
关注(0)|答案(1)|浏览(465)

我正在travisci上实现自动化测试。下面是 docker-compose.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文件?

yws3nbqq

yws3nbqq1#

发生这种情况的原因是,在执行以下命令时,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' healthcheck中使用的命令返回 0 if端口 :0CEA ( :3306 以十六进制表示)绑定到ipv4或ipv6(意味着mysql已准备好接受连接)。因为没有像 curl 或者 wgetmysql:5.7 这似乎是检查端口是否打开的唯一命令
无论您选择什么解决方案,都必须在 docker-compose up 以及 docker exec 对于繁忙的等待,就像下面的第三个解决方案一样 healthcheck (我更喜欢的解决方案):

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

相关问题