繁体   English   中英

Dockerfile 构建 Laravel Telescope 尝试连接到 Redis 服务尚未“启动”

[英]Dockerfile build Laravel Telescope trying to connect to Redis service yet to "up"

我的项目是在 docker-compose 文件中定义的,但我对 docker-compose 定义不太熟悉。

当我尝试在全新设置中docker-compose up -d时,在构建 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 想要在托管容器之前首先构建我的图像。


编辑我刚刚发现这个 GitHub 问题链接到我的问题: https : //github.com/laravel/telescope/issues/620 问题似乎与 Telescope 尝试使用缓存驱动程序有关。 不同之处在于我不仅仅将 Docker 用于 CI/CD,而是用于我的本地开发。


我该如何解决这个问题? 有没有办法在构建my_app之前先强制 Redis 容器启动? 或者是否有 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

我目前通过向 Dockerfile 添加--no-scripts并添加了start.sh来缓解这个问题。 因为它是绑定到想要访问 Redis 的post-autoload-dump Laravel 的包发现脚本。

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"]

启动文件

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

有一种方法可以强制一个服务在docker compose depends_on 中等待另一个服务,但它只等到容器启动而不是服务,并修复您必须通过使用command来执行检查的 bash 脚本来自定义 redis 映像对于 redis 容器和 redis 守护程序可用性,请检查启动顺序以了解如何设置它。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM