我已经创建了php-apache容器并将其与MYSQL容器链接。但是,当我尝试使用php文件中的PDO建立连接时,出现了错误。有谁知道如何解决?谢谢。
PDO错误:
致命错误:未被捕获的PDOException:PDO :: __ construct():php_network_getaddresses:getaddrinfo失败:名称或服务在/var/www/html/index.php:3中未知堆栈跟踪:#0 / var / www / html /index.php(3):PDO-> __ construct('mysql:host = mysq ...','root','root')#1 {main}下一个PDOException:SQLSTATE [HY000] [2002] php_network_getaddresses:getaddrinfo失败:/var/www/html/index.php:3中未知的名称或服务堆栈跟踪:#0 /var/www/html/index.php(3):PDO-> __ construct('mysql:host = mysq ...','root','root')#1 {main}在第3行的/var/www/html/index.php中抛出
我的目录结构:
.
├── mysql
├── php
| └── Dockerfile
├── src
| └── index.php
└── docker-compose.yml
我的index.php的内容:
$connection = new PDO('mysql:host=mysql-db,dbname=app', 'root', 'root');
PHP Dockerfile:
FROM php:7.3.3-apache
RUN docker-php-ext-install -j$(nproc) pdo_mysql
docker-compose.yml:
version: '3'
services:
apache-php:
build:
./php
volumes:
- ./src:/var/www/html
ports:
- "8080:80"
depends_on:
- mysql-db
links:
- mysql-db
mysql-db:
image: mysql:5.7
ports:
- "3306:3306"
volumes:
- /mysql:/var/lib/mysql
environment:
MYSQL_ROOT_PASSWORD: root
MYSQL_DATABASE: app
答案 0 :(得分:1)
首先,由于两种服务都在同一网络中,因此您无需links:
即可自动完成。
第二,depends_on
不会等到MySQL服务器启动并运行,并且PHP服务有机会在准备就绪之前开始通信,这就是为什么会收到此错误。
在这种情况下,IT最好为您的PHP服务实现“等待”功能。
为此,您需要向您的PHP服务和类似这样的代码添加一个入口点
docker文件
COPY ./docker-entrypoint.sh /
ENTRYPOINT ["/docker-entrypoint.sh"]
docker-entrypoint.sh
#!/bin/sh -e
until nc -vz mysql-db:3306 > /dev/null; do
>&2 echo "mysql-db:3306 is unavailable - sleeping"
sleep 2
done
>&2 echo "mysql-db is up"
exec "YOUR COMMAND"
exit 0
答案 1 :(得分:0)
我这样做有2个问题:
1)php:apache图像需要大量工作来运行php应用程序,最好自己制作一个,我是从ubuntu 18:04图像中获取的
2)我不记得为什么,但是需要将mysql设置为允许mysql_native_passwords才能使用(在我的情况下)php
这是我在课堂上进行测试的docker-compose文件(因此称为“ examen”标签)以共享我的网络应用程序:
navigation.dispatch(
CommonActions.reset({
index: 0,
routes: [
{name: YOUR_ROUTE_NAME},
],
})
);
PD。我是一位超级新手开发人员(仍在学习中),请放心。
编辑。如果您自己制作图像,请不要忘记version: '3'
services:
app:
image: gnomejodas/httpd-php:examen
ports:
- 80:80
volumes:
- ./src:/var/www/html
links:
- db
db:
image: mysql
command: --default-authentication-plugin=mysql_native_password
volumes:
- ./db:/var/lib/mysql
,以便在运行容器时启动apache服务。
答案 2 :(得分:0)
毕竟,发现在我的php代码中,主机定义后有一个逗号,而不是分号。我很抱歉。