使用docker-compose编排, 首次部署连接数据库出现Connection refused的错误

1. 运行环境

Ubuntu 20.04
Docker 20.10.10
docker-compose version 1.25.0

1). 当前使用的 Laravel 版本?

Laravel Framework 8.69.0

2). 当前使用的 php/php-fpm 版本?

PHP 版本:7.4
php-fpm 版本:7.4

3). 当前系统

Ubuntu 20.04

4). 业务环境

开发环境

5). 相关软件版本

  • nginx/1.21.4
  • Redis6.2.6
  • Mysql 5.7
  • PHP7.4

2. 问题描述?

使用Jenkins自动化构建+部署, 首次部署执行 php artisan migrate 会提示 SQLSTATE[HY000] [2002] Connection refused 的错误,
但手动执行 docker-compose exec php php artisan migrate 就可以成功迁移数据库文件, 且之后的部署也不会出现上述错误. 也使用过sleep再执行也是一样(首次部署), 看下是否有更好的方式还是什么地方错了?

使用docker-compose编排, 首次部署连接数据库出现Connection refused的错误

.env文件

...
DB_CONNECTION=mysql
DB_HOST=mysql
DB_PORT=3306
DB_DATABASE=dbname
DB_USERNAME=dbuser
DB_PASSWORD=dbpwd
...

docker-compose.yml

mysql:
        image: mysql:5.7.29
        container_name: mysql
        restart: unless-stopped
        tty: true
        command: --default-authentication-plugin=mysql_native_password
        volumes:
            - ./db:/var/lib/mysql:rw
        environment:
            MYSQL_DATABASE: dbname
            MYSQL_USER: dbuser
            MYSQL_PASSWORD: dbpwd
            MYSQL_ROOT_PASSWORD: dbpwd.root
            SERVICE_TAGS: dev
            SERVICE_NAME: mysql
        networks:
            - laravel

脚本内容

#!/usr/bin/env bash

chmod o+w .env
sleep 5

CALL_FUNC=${1:-'default'}

default() {
    . .env
    php artisan config:clear
    php artisan cache:clear
    php artisan cache:clear
    php artisan migrate
    php-fpm7.4 -F
}

queue() {
    queue_name=${2:-'default'}
    php artisan queue:work --name="$queue_name" --queue="$queue_name" --verbose --tries=3 --timeout=60

    while [ $? -ne 0 ];do
        sleep 3
        queue
    done
}

scheduler() {
    while true; do
        php artisan schedule:run --verbose && sleep 60
    done
}

$CALL_FUNC
w_W_v_V
《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
最佳答案

没看到你全部的 docker-compose.yml 文件,没办法尝试
先确认你定义过的 networks laravel 是不是 bridge
其次 links 应该配置的是 networks 的名字,不是容器名 如果是同一个网络下,可以不配 links
检查一下是不是这个原因造成的吧

3年前 评论
讨论数量: 3
w_W_v_V

新人发言也太难了, 一个星期都没人回复

3年前 评论

没看到你全部的 docker-compose.yml 文件,没办法尝试
先确认你定义过的 networks laravel 是不是 bridge
其次 links 应该配置的是 networks 的名字,不是容器名 如果是同一个网络下,可以不配 links
检查一下是不是这个原因造成的吧

3年前 评论
w_W_v_V

@是阿东啊 很奇怪的, 部署到另外一个服务器又可以了

3年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!