gpt4 book ai didi

php - Symfony 无法连接到 MySQL Docker 容器

转载 作者:行者123 更新时间:2023-11-29 11:06:04 25 4
gpt4 key购买 nike

我在 Mac OS sierra 上运行了三个 Docker 容器,即 webmysqlmongo,并且已链接这两个 mongo mysqlweb 中,它本质上是 Ubuntu Xenail 基础,添加了 Apache 和 PHP。

我目前正在将本地 Symfony 项目安装到 web 容器中,这似乎工作正常,但是当我尝试以任何方式与数据库交互时,我得到:

An exception occured in driver: SQLSTATE[HY000] [2002] Connection refused

我几乎尝试了所有参数值的组合,但始终得到相同的结果。

我怀疑这可能与我链接容器的方式有关?

我正在学习Docker,所以请原谅我的知识有限。

谢谢!

Web dockerfile:

FROM ubuntu:xenial
MAINTAINER Some Guy <someguy@domain.com>

RUN apt-get update && apt-get install -y \
apache2 \
vim \
php \
php-common \
php-cli \
php-curl \
php-mysql \
php-mongodb \
libapache2-mod-php \
php-gd

RUN mkdir -p /var/www/symfony.local/public_html
RUN chown -R $USER:$USER /var/www/symfony.local/public_html

RUN chmod -R 755 /var/www

COPY config/php/php.ini /usr/local/etc/php/
COPY config/apache/sites-available/*.conf /etc/apache2/sites-available/

RUN a2enmod rewrite

RUN a2dissite 000-default.conf
RUN a2ensite symfony.local.conf

EXPOSE 80

CMD ["/usr/sbin/apache2ctl", "-D", "FOREGROUND"]

Mysql dockerfile:

FROM mysql:5.7
MAINTAINER Some Guy <someguy@domain.com>

# Set the root users password
ENV MYSQL_ROOT_PASSWORD password

# Copy over the DB dump to be run upon creation
COPY sql/ /docker-entrypoint-initdb.d

# Copy over the custom mysql config file
COPY config/ /etc/mysql/conf.d

EXPOSE 3306

运行命令:

docker run --name mongo -d mongo #Im making use of the official Mongo image
docker run --name mysql -v /usr/local/var/mysql:/var/lib/mysql -d someguy/local:mysql
docker run --name web -d -p 80:80 --link mysql:mysql --link mongo:mongo -v ~/Sites/symfony.local/:/var/www/symfony.local/public_html/ someguy/local:web

Symfony 参数.yml 文件:

parameters:
database_host: mysql
database_port: 3306
database_name: gorilla
database_user: root
database_password: password

更新:

因此我已转而使用 docker-compose,但仍然收到相同的错误。

docker-compose.yml 文件

version: "2"
services:
web:
build: ./web
ports:
- "80:80"
volumes:
- ~/Sites/symfony.local/:/var/www/symfony.local/public_html/
depends_on:
- db
- mongo
mongo:
image: mongo:latest
mysql:
image: mysql:latest
ports:
- "3306:3306"
environment:
MYSQL_ROOT_PASSWORD: password

最佳答案

An exception occured in driver: SQLSTATE[HY000] [2002] Connection refused

这意味着,它与您的网络本身无关 - 链接很好。

您缺少的是用户是如何创建的,如果用户已创建 https://github.com/docker-library/mysql/blob/c207cc19a272a6bfe1916c964ed8df47f18479e7/5.7/docker-entrypoint.sh#L122 ..所以实际上本身没有主机限制。

您的情况的问题是,“sql/”文件夹内有什么 - 这些脚本在入口点期间执行。

请确保永远不要在这些脚本中使用 exitX,它们会中断主脚本,请参阅 https://github.com/docker-library/mysql/blob/c207cc19a272a6bfe1916c964ed8df47f18479e7/5.7/docker-entrypoint.sh#L151

检查 mysql 的 docker 日志以确保脚本没有向您输出任何警告,请使用 https://github.com/docker-library/mysql/blob/c207cc19a272a6bfe1916c964ed8df47f18479e7/5.7/docker-entrypoint.sh作为引用。

最后但并非最不重要的一点是,请使用docker-compose。如果您对计时有疑问(mysql 开始变慢并且您的 web 容器崩溃),请在 web 中使用“等待 mysql”入口点:

#!/bin/bash
# this script does only exist to wait for the database before we fire up tomcat / standalone

RET=1
echo "Waiting for database"
while [[ RET -ne 0 ]]; do
sleep 1;
if [ -z "${db_password}" ]; then
mysql -h $db_host -u $db_user -e "select 1" > /dev/null 2>&1; RET=$?
else
mysql -h $db_host -u $db_user -p$db_password -e "select 1" > /dev/null 2>&1; RET=$?
fi
done

使用 ENV 或任何适合您的内容相应地设置 db_host$user$pasword

关于php - Symfony 无法连接到 MySQL Docker 容器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41387390/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com