mysql 的 getaddrinfo 失败:提供了节点名或服务名

getaddrinfo for mysql failed: nodename nor servname provided

我在 Mac 和 M1 上使用 docker 到 运行 nginx、mariadb 和 php (8.1)。 我在主机上安装了 Laravel,使用 composer 并在 .env 文件中设置了我的数据库凭据。

当我在主机上 运行 php artisan migrate 时,我得到:

SQLSTATE[HY000] [2002] php_network_getaddresses: getaddrinfo for mysql failed: nodename nor servname provided, or not known (SQL: select * from information_schema.tables where table_schema = api and table_name = migrations and table_type = 'BASE TABLE')

我已经搜索过,发现这可能与DB_HOST设置有关。 我的是:mysql,什么是container_name。我也尝试了 127.0.0.10.0.0.0localhost,结果相同。

在 mysql 我得到:

select * from information_schema.tables where table_schema = "api" and table_name = "migrations" and table_type = 'BASE TABLE';
Empty set (0,03 sec)

这是我的清单:

version: '3'
services:
    nginx:
        container_name: nginx
        image: nginx:alpine
        volumes:
            - "./etc/nginx/default.conf:/etc/nginx/conf.d/default.conf"
            - "./etc/ssl:/etc/ssl"
            - "./web:/var/www/html"
        ports:
            - "80:80"
            - "433:443"
        environment:
            - NGINX_HOST=${NGINX_HOST}
        command: /bin/sh -c "nginx -g 'daemon off;'"
        restart: always
        depends_on:
            - php
            - mysql
    php:
        container_name: php
        image: nanoninja/php-fpm:${PHP_VERSION}
        platform: linux/x86_64
        restart: always
        volumes:
            - "./etc/php/php.ini:/usr/local/etc/php/conf.d/php.ini"
            - "./web:/var/www/html"
    phpmyadmin:
        container_name: phpmyadmin
        image: phpmyadmin/phpmyadmin
        platform: linux/x86_64
        container_name: phpmyadmin
        ports:
            - "8080:80"
        environment:
            - PMA_ARBITRARY=1
            - PMA_HOST=${MYSQL_HOST}
        restart: always
        depends_on:
            - mysql
    mysql:
        image: mariadb:${MYSQL_VERSION}
        container_name: ${MYSQL_HOST}
        restart: always
        env_file:
            - ".env"
        environment:
            - MYSQL_DATABASE=${MYSQL_DATABASE}
            - MYSQL_ROOT_PASSWORD=${MYSQL_ROOT_PASSWORD}
            - MYSQL_USER=${MYSQL_USER}
            - MYSQL_PASSWORD=${MYSQL_PASSWORD}
        ports:
            - "3306:3306"
        volumes:
            - "./data/db/mysql:/var/lib/mysql"

主机名 'mysql' 仅当您 运行 在 docker-compose 中或当容器以其他方式链接时或者如果您在 /etc/hosts 文件中指定它时才有效.我想问题是你需要 运行 那个 php 容器内的 artisan 命令(而不是 运行 从主机本身发出它)和 docker exec 这样的东西:

docker exec -it <php-containers-name> php artisan migrate

另一种方法是将数据库容器端口暴露给主机,以便您可以使用 0.0.0.0:3306 访问它。

然后使用 docker-compose 而不是纯 docker 中继到正确的容器。此命令的输出是什么?

docker-compose exec -w="/var/www/html" php php artisan migrate

(它 运行 是 php 容器中的一个 'php artisan migrate',使用 /var/www/html 作为工作目录)