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.1
或 0.0.0.0
或 localhost
,结果相同。
在 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 作为工作目录)
我在 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.1
或 0.0.0.0
或 localhost
,结果相同。
在 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 作为工作目录)