Dockerfile build Laravel Телескоп пытается подключиться к сервису Redis, пока он не "вверх" - PullRequest
0 голосов
/ 19 января 2020

Мой проект определен в 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

Ответы [ 2 ]

0 голосов
/ 19 января 2020

Существует способ заставить службу ждать другую службу в docker compose depen_on , но это только ожидание, пока не будет запущен контейнер, а службы, и исправить то, что вы должны настроить redis изображение с помощью command для выполнения сценария bash, который проверяет наличие контейнера redis и проверки доступности демона redis startup-order о том, как его настроить.

0 голосов
/ 19 января 2020

Я сейчас смягчил это, добавив --no-scripts в Dockerfile и добавил start.sh. Так как это Laravel скрипт обнаружения пакетов, который связывается с post-autoload-dump, который хочет получить доступ к Redis.

Отрывок Dockerfile

#...
# Change current user to www
USER www

# Install packages
RUN composer global require hirak/prestissimo && composer install --no-scripts

RUN chmod +x /var/www/scripts/start.sh

# Expose port 9000 and start php-fpm server
EXPOSE 9000
CMD ["/var/www/scripts/start.sh"]

start. sh

#!/usr/bin/env sh
composer dumpautoload
php-fpm
...