php 容器无法在 teamcity 管道中访问 mysql

问题描述 投票:0回答:1

我最近尝试将我的管道迁移到 teamcity 的一个项目,但遇到了 teamcity 中的管道无法连接到我的 mysql 容器的问题。

使用 mysql 是一个硬性要求,并且不能将其更改为 sqlite,因为我们创建也需要测试的自定义 mysql 函数。

我创建了一个全新的 Laravel 项目,没有任何修改来测试新的管道。默认 Laravel 11 应用程序的唯一更改是 docker-compose.yml 文件。

这是我的 docker-compose.yml

services:
  php:
    hostname: teamcity-php-fpm
    container_name: teamcity-php-fpm
    build:
      context: docker/php
    ports:
      - 5173:5173
    volumes:
      - .:/var/www:cached
    networks:
      - teamcity-app
  db:
    networks:
      - teamcity-app
    image: mysql:8.3
    ports:
      - 3306:3306
    volumes:
      - teamcity-mysql:/var/lib/mysql
      - ./docker/logs:/var/log/mysql
      - ./docker/db/my.cnf:/etc/mysql/conf.d/my.cnf
      - ./docker/db/sql:/docker-entrypoint-initdb.d
    environment:
      MYSQL_ROOT_PASSWORD: ${DB_PASSWORD}
      MYSQL_DATABASE: ${DB_DATABASE}
      MYSQL_USER: ${DB_USERNAME}
      MYSQL_PASSWORD: ${DB_PASSWORD}

  nginx:
    image: nginx
    ports:
      - 80:80
    volumes:
      - .:/var/www
      - ./docker/nginx/default.conf:/etc/nginx/conf.d/default.conf
      - ./docker/nginx/nginx.conf:/etc/nginx/nginx.conf
    depends_on:
      - php
    networks:
      - teamcity-app
volumes:
    teamcity-mysql:
        driver: local
networks:
  teamcity-app:
    driver: bridge

在本地,我的构建成功并且一切正常,但是当我尝试在 teamcity 中运行相同的内容时,它无法连接到数据库。

SQLSTATE[HY000] [2002] Connection refused (Connection: mysql, SQL: select table_name as `name`, (data_length + index_length) as `size`, table_comment as `comment`, engine as `engine`, table_collation as `collation` from information_schema.tables where table_schema = 'laravel' and table_type in ('BASE TABLE', 'SYSTEM VERSIONED') order by table_name)

teamcity 内的步骤:

  • 复制.env.teamcity.env
  • 构建 docker-compose.yml 文件
  • 奔跑
    docker exec teamcity-php-fpm php artisan migrate
    << This is failing

我似乎无法弄清楚为什么这在 teamcity 内失败,但在本地却失败?

mysql docker teamcity
1个回答
0
投票

我设法找到了问题,这是由于 mysql 服务器没有完成启动,而构建已经尝试运行单元测试。

我的改变

docker-compose.yml

  services:
   mysql:
    healthcheck:
      test: [ "CMD", "mysqladmin", "ping", "-h", "localhost" ]
      interval: 15s
      timeout: 10s
      retries: 10
   php-fpm:
      depends_on:
        mysql:
          condition: service_healthy
© www.soinside.com 2019 - 2024. All rights reserved.