Docker部署Laravel遇web_1容器找不到及日志异常问题求助
问题描述
使用Docker部署Laravel项目时遇到以下问题:
- 执行
docker-compose exec web bash提示No container found for web_1 - web和admin_queue容器日志仅输出
Interactive shell,重启容器后问题依旧 docker-compose up -d --build构建成功,但无法正常进入容器
提供的配置文件
docker-compose.yml
version: '3.7' services: web: # I USE THIS NAME IN docker-compose command container_name: banners_web build: context: . dockerfile: Dockerfile volumes: - .:/app ports: - 8000:8000 depends_on: - AdminRMQBannersDb admin_queue: container_name: banners_admin_queue build: context: . dockerfile: Dockerfile depends_on: - AdminRMQBannersDb AdminRMQBannersDb: container_name: banners_db image: mysql:5.7.22 environment: MYSQL_DATABASE: AdminRMQBannersDb MYSQL_USER: root MYSQL_PASSWORD: root MYSQL_ROOT_PASSWORD: root volumes: - ./storage/dbdata:/var/lib/mysql ports: - 33063:3306
Dockerfile
FROM php:8.0 RUN apt-get update && apt-get install -y \ libfreetype6-dev \ libjpeg62-turbo-dev \ libmcrypt-dev \ libpng-dev \ zlib1g-dev \ libxml2-dev \ libzip-dev \ libonig-dev \ graphviz \ && docker-php-ext-configure gd \ && docker-php-ext-install -j$(nproc) gd \ && docker-php-ext-install pdo_mysql \ && docker-php-ext-install mysqli \ && docker-php-ext-install zip \ && docker-php-ext-install sockets \ && docker-php-ext-install exif \ && docker-php-source delete \ && curl -sS https://getcomposer.org/installer | php -- \ --install-dir=/usr/local/bin --filename=composer WORKDIR /app COPY . . RUN composer install
问题原因与解决方法
1. No container found for web_1 问题
你给web容器指定了自定义名称banners_web,而docker-compose exec web bash默认会查找服务名加默认后缀(如web_1)的容器,两者不匹配导致报错。解决方式:
使用自定义容器名执行进入命令:
docker-compose exec banners_web bash # 或直接用docker命令 docker exec -it banners_web bash
2. 容器日志显示Interactive shell且无法长期运行
官方php:8.0镜像默认启动命令是进入交互式shell,当用-d后台启动时,没有终端交互,容器会立刻退出,因此仅输出Interactive shell日志。需要给web和admin_queue服务指定持续运行的启动命令:
修改docker-compose.yml:
给web服务添加Laravel内置服务器启动命令,给admin_queue添加队列启动命令:
version: '3.7' services: web: container_name: banners_web build: context: . dockerfile: Dockerfile volumes: - .:/app ports: - 8000:8000 depends_on: - AdminRMQBannersDb # 启动Laravel内置服务器,保持容器运行 command: php artisan serve --host=0.0.0.0 --port=8000 admin_queue: container_name: banners_admin_queue build: context: . dockerfile: Dockerfile depends_on: - AdminRMQBannersDb # 启动Laravel队列进程 command: php artisan queue:work AdminRMQBannersDb: container_name: banners_db image: mysql:5.7.22 environment: MYSQL_DATABASE: AdminRMQBannersDb MYSQL_USER: root MYSQL_PASSWORD: root MYSQL_ROOT_PASSWORD: root volumes: - ./storage/dbdata:/var/lib/mysql ports: - 33063:3306
3. 额外优化建议
- 优化Dockerfile缓存:调整文件复制顺序,先复制依赖配置文件,再安装依赖,最后复制项目代码,避免每次修改代码都重新安装composer依赖:
FROM php:8.0 RUN apt-get update && apt-get install -y \ libfreetype6-dev \ libjpeg62-turbo-dev \ libmcrypt-dev \ libpng-dev \ zlib1g-dev \ libxml2-dev \ libzip-dev \ libonig-dev \ graphviz \ && docker-php-ext-configure gd \ && docker-php-ext-install -j$(nproc) gd \ && docker-php-ext-install pdo_mysql \ && docker-php-ext-install mysqli \ && docker-php-ext-install zip \ && docker-php-ext-install sockets \ && docker-php-ext-install exif \ && docker-php-source delete \ && curl -sS https://getcomposer.org/installer | php -- \ --install-dir=/usr/local/bin --filename=composer WORKDIR /app # 先复制依赖配置文件,缓存composer安装步骤 COPY composer.json composer.lock ./ RUN composer install --no-dev --optimize-autoloader # 再复制整个项目文件 COPY . .
- 配置Laravel环境变量:确保
.env文件中数据库连接地址为AdminRMQBannersDb(docker-compose中数据库服务名即为容器hostname)。
4. 验证解决效果
执行以下命令重新构建并启动容器:
docker-compose down docker-compose up -d --build
查看容器运行状态:
docker-compose ps
确认web和admin_queue容器处于Up状态后,即可正常进入容器操作。
内容的提问来源于stack exchange,提问作者mstdmstd
相关产品推荐
相关产品推荐

