Мой проект определен в docker -композитном файле, но я не слишком знаком с docker -композиционными определениями.
Когда я пытаюсь docker-compose up -d
в свободном sh При установке во время построения образа docker произошла следующая ошибка.
Это после composer install
, в post-autoload-dump
. Laravel пытается автоматически обнаружить пакеты (php artisan package:discover
).
Generating optimized autoload files
> Illuminate\Foundation\ComposerScripts::postAutoloadDump
> @php artisan package:discover --ansi
RedisException : php_network_getaddresses: getaddrinfo failed: Name or service not known
at [internal]:0
1|
Exception trace:
1 ErrorException::("Redis::connect(): php_network_getaddresses: getaddrinfo failed: Name or service not known")
/var/www/vendor/laravel/framework/src/Illuminate/Redis/Connectors/PhpRedisConnector.php:126
2 Redis::connect("my_redis", "6379")
/var/www/vendor/laravel/framework/src/Illuminate/Redis/Connectors/PhpRedisConnector.php:126
Please use the argument -v to see more details.
Script @php artisan package:discover --ansi handling the post-autoload-dump event returned with error code 1
ERROR: Service 'my_app' failed to build: The command '/bin/sh -c composer global require hirak/prestissimo && composer install' returned a non-zero code: 1
Причина, по которой он не может подключиться к my_redis:6379
, заключается в том, что my_redis
- это другая служба в том же файле docker-compose.yml
. Поэтому я предполагаю, что домен еще не готов, так как docker -compose хочет сначала создать мои изображения перед размещением контейнеров.
EDIT Я только что обнаружил, что эта проблема GitHub связана с моя проблема: https://github.com/laravel/telescope/issues/620. Кажется, что проблема связана с тем, что Telescope пытается использовать драйвер Cache. Разница в том, что я не использую Docker только для CI / CD, но для локального развития.
Как я могу решить эту проблему? Есть ли способ заставить контейнер Redis сначала подняться до сборки my_app
? Или есть Laravel способ предотвратить любое обнаружение домена? Или есть способ указать, что построение изображения зависит от другого сервиса, который будет доступен?
Если вы хотите увидеть мой docker-compose.yml
:
version: '3.6'
services:
# Redis Service
my_redis:
image: redis:5.0-alpine
container_name: my_redis
restart: unless-stopped
tty: true
ports:
- "6379:6379"
volumes:
- ./redis/redis.conf:/usr/local/etc/redis/redis.conf
- redisdata:/data
networks:
- app-network
# Postgres Service
my_db:
image: postgres:12-alpine
container_name: my_db
restart: unless-stopped
tty: true
ports:
- "5432:5432"
environment:
POSTGRES_DB: my
POSTGRES_PASSWORD: admin
SERVICE_TAGS: dev
SERVICE_NAME: postgres
volumes:
- dbdata:/var/lib/postgresql
- ./postgres/init:/docker-entrypoint-initdb.d
networks:
- app-network
# PHP Service
my_app:
build:
context: .
dockerfile: Dockerfile
image: my/php
container_name: my_app
restart: unless-stopped
tty: true
environment:
SERVICE_NAME: my_app
SERVICE_TAGS: dev
working_dir: /var/www
volumes:
- ./:/var/www
- /tmp:/tmp #For CS Fixer
- ./php/local.ini:/usr/local/etc/php/conf.d/local.ini
- fsdata:/my
networks:
- app-network
# Nginx Service
my_webserver:
image: nginx:alpine
container_name: my_webserver
restart: unless-stopped
tty: true
ports:
- "8080:80"
volumes:
- ./:/var/www
- ./nginx/conf.d/:/etc/nginx/conf.d/
networks:
- app-network
# Docker Networks
networks:
app-network:
driver: bridge
# Volumes
volumes:
dbdata:
driver: local
redisdata:
driver: local
fsdata:
driver: local