Кажется, что мой php-контейнер не может разрешить хост «db» моего контейнера базы данных, когда я запускаю php artisan migrate
, мне интересно, не настроил ли я что-то неправильно в конфигурации.
Пробовал возиться с параметрами depend_on: и links: в файле dockerfile.
докер-compose.yml
version: '3.3'
services:
db:
container_name: tasks-db
image: mariadb:latest
volumes:
- dbdata:/var/lib/mysql
environment:
- MYSQL_ROOT_PASSWORD=password
- MYSQL_DATABASE=tasks
- MYSQL_USER=root
- MYSQL_PASSWORD=password
restart: always
webserver:
container_name: tasks-webserver
image: nginx:latest
ports:
- "8080:80"
- "443:443"
volumes:
- .:/app
- ./provision/nginx/:/etc/nginx/conf.d/
depends_on:
- php
restart: always
php:
container_name: tasks-php
build:
context: .
dockerfile: provision/php.docker
depends_on:
- db
restart: always
env_file:
- .env
volumes:
dbdata:
driver: local
предоставление/db.docker
FROM php:7.3-fpm
# Add dependencies
RUN apt-get update -y && apt-get install -y openssl libpng-dev libxml2-dev curl cron git libzip-dev zip unzip
# Install php extensions
RUN docker-php-ext-install pdo mbstring gd xml pdo_mysql zip
# Install composer
RUN curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer
COPY . /app/
WORKDIR /app
RUN chown -R $USER:www-data /app/storage
RUN chown -R $USER:www-data /app/bootstrap/cache
RUN chmod -R 775 /app/storage
RUN chmod -R 775 /app/bootstrap/cache
# Install composer dependencies
RUN composer install
RUN php artisan optimize
#RUN php artisan migrate --seed
RUN crontab -l | { cat; echo "* * * * * php /app/artisan schedule:run >> /dev/null 2>&1"; } | crontab -
STOPSIGNAL SIGTERM
CMD ["php-fpm"]
db.докер
FROM mariadb:latest
CMD ["mysqld", "--user=mysql"]
Я получаю эту ошибку:
Step 13/16 : RUN php artisan migrate --no-interaction --seed
---> Running in ccbfcde9324d
Illuminate\Database\QueryException : SQLSTATE[HY000] [2002] php_network_getaddresses: getaddrinfo failed: Temporary failure in name resolution (SQL: select * from information_schema.tables where table_schema = tasks and table_name = migrations and table_type = 'BASE TABLE')
at /app/vendor/laravel/framework/src/Illuminate/Database/Connection.php:664
660| // If an exception occurs when attempting to run a query, we'll format the error
661| // message to include the bindings with SQL, which will make this exception a
662| // lot more helpful to the developer instead of just the database's errors.
663| catch (Exception $e) {
> 664| throw new QueryException(
665| $query, $this->prepareBindings($bindings), $e
666| );
667| }
668|
Exception trace:
1 PDOException::("PDO::__construct(): php_network_getaddresses: getaddrinfo failed: Temporary failure in name resolution")
/app/vendor/laravel/framework/src/Illuminate/Database/Connectors/Connector.php:70
2 PDO::__construct("mysql:host=db;port=3306;dbname=tasks", "root", "password", [])
/app/vendor/laravel/framework/src/Illuminate/Database/Connectors/Connector.php:70
Please use the argument -v to see more details.
ERROR: Service 'php' failed to build: The command '/bin/sh -c php artisan migrate --no-interaction --seed' returned a non-zero code: 1
Вам не хватает
links:
- db
в вашей конфигурации php
.
В любом случае, как упомянул @David Maze, запуск php artisan migrate
в Dockerfile — это не только плохая практика, но и не сработает.
Вы должны запускать эту команду только тогда, когда ваши контейнеры запущены. Подумайте об этом, php artisan migrate
изменит данные другого контейнера, который не гарантирует, что он будет работать во время создания образа. Это противоречит философии контейнера.
Вы не можете получить доступ к другим службам из Dockerfile и не можете запускать миграцию базы данных во время сборки образа. (Что, если вы уничтожите и воссоздадите базу данных, но не перестроите образ?) В связанном вопросе есть решение на основе точки входа, которое должно работать.