我最近尝试将我的管道迁移到 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 内的步骤:
docker exec teamcity-php-fpm php artisan migrate
<< This is failing我似乎无法弄清楚为什么这在 teamcity 内失败,但在本地却失败?
我设法找到了问题,这是由于 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