所以我已经搜索了很多,每个人都说要么使.env文件中的数据库主机等于mysql,要么使docker容器ip都对我有用,但都对我不起作用?
我很确定这是一个主机问题,但目前不知道吗?
这是我的docker-compose.yml文件:
version: "2"
services:
web:
container_name: algm
build:
context: .
dockerfile: container-build/web/Dockerfile
environment:
- MYSQL_DATABASE=dbname
- MYSQL_USER=dbuser
- MYSQL_PASSWORD=654321
- MYSQL_HOST=db
ports:
- "8080:80"
volumes:
- .:/var/www
depends_on:
- db
db:
image: mysql:5.7
ports:
- "6603:3306"
environment:
- MYSQL_ROOT_PASSWORD=654321
- MYSQL_USER=dbuser
- MYSQL_PASSWORD=654321
- MYSQL_DATABASE=dbname
volumes:
- "mysql_data:/var/lib/mysql"
- ./data/schema.sql:/docker-entrypoint-initdb.d/schema.sql
volumes:
mysql_data: { driver: local }
这是我在.env文件中的连接:
DB_CONNECTION=mysql
DB_HOST=mysql
DB_PORT=3306
DB_DATABASE=dbname
DB_USERNAME=dbuser
DB_PASSWORD=654321
所以我通过以下命令进入我的docker bash:
sudo docker-compose exec web /bin/bash
并且我可以进行模型和迁移,但不能迁移?我收到错误:
Illuminate\Database\QueryException : SQLSTATE[HY000] [2002] php_network_getaddresses: getaddrinfo failed: Name or service not known (SQL: select * from information_schema.tables where table_schema = dbname and table_name = migrations and table_type = 'BASE TABLE')
at /var/www/vendor/laravel/framework/src/Illuminate/Database/Connection.php:665
661| // If an exception occurs when attempting to run a query, we'll format the error
662| // message to include the bindings with SQL, which will make this exception a
663| // lot more helpful to the developer instead of just the database's errors.
664| catch (Exception $e) {
> 665| throw new QueryException(
666| $query, $this->prepareBindings($bindings), $e
667| );
668| }
669|
Exception trace:
1 PDOException::("PDO::__construct(): php_network_getaddresses: getaddrinfo failed: Name or service not known")
/var/www/vendor/laravel/framework/src/Illuminate/Database/Connectors/Connector.php:70
2 PDO::__construct("mysql:host=mysql;port=3306;dbname=dbname", "dbuser", "654321", [])
/var/www/vendor/laravel/framework/src/Illuminate/Database/Connectors/Connector.php:70
Please use the argument -v to see more details.
更新,如果需要它,这是我的Dockerfile:
#
# Use this dockerfile to run the application.
#
# Start the server using docker-compose:
#
# docker-compose build
# docker-compose up
#
# NOTE: In future examples replace {{volume_name}} with your projects desired volume name
#
# You can install dependencies via the container:
#
# docker-compose run {{volume_name}} composer install
#
# You can manipulate dev mode from the container:
#
# docker-compose run {{volume_name}} composer development-enable
# docker-compose run {{volume_name}} composer development-disable
# docker-compose run {{volume_name}} composer development-status
#
# OR use plain old docker
#
# docker build -f Dockerfile-dev -t {{volume_name}} .
# docker run -it -p "8080:80" -v $PWD:/var/www {{volume_name}}
#
FROM php:7.2-apache
RUN apt-get update \
&& apt-get install -y vim git zlib1g-dev mariadb-client libzip-dev \
&& docker-php-ext-install zip mysqli pdo_mysql \
&& pecl install xdebug \
&& docker-php-ext-enable xdebug \
&& echo 'xdebug.remote_enable=on' >> /usr/local/etc/php/conf.d/xdebug.ini \
&& echo 'xdebug.remote_host=host.docker.internal' >> /usr/local/etc/php/conf.d/xdebug.ini \
&& echo 'xdebug.remote_port=9000' >> /usr/local/etc/php/conf.d/xdebug.ini \
&& a2enmod rewrite \
&& sed -i 's!/var/www/html!/var/www/public!g' /etc/apache2/sites-available/000-default.conf \
&& mv /var/www/html /var/www/public \
&& curl -sS https://getcomposer.org/installer \
| php -- --install-dir=/usr/local/bin --filename=composer \
&& echo "AllowEncodedSlashes On" >> /etc/apache2/apache2.conf
WORKDIR /var/www
我已经尝试过您的配置,并且可以正常工作。您只需要将DB_HOST=mysql
更改为您的容器名称DB_HOST=db
DB_CONNECTION=mysql
DB_HOST=db
DB_PORT=3306
DB_DATABASE=dbname
DB_USERNAME=dbuser
DB_PASSWORD=654321
然后转到容器内的应用程序文件夹并运行php artisan config:clear
,php artisan cache:clear
,然后执行迁移。