Docker容器挂载卷后自动执行Composer Install避免vendor被覆盖方案咨询
解决方案:启动时自动执行Composer Install并保持PHP-FPM运行
1. 修改Dockerfile,移除构建时的代码复制与Composer操作,添加启动脚本
FROM php:fpm # Install dependencies and PHP extensions RUN apt-get update && apt-get upgrade -y && \ apt-get install -y libzip-dev zip nano && \ docker-php-ext-install pdo pdo_mysql && \ pecl install xdebug && docker-php-ext-enable xdebug && \ apt-get install -y libfreetype6-dev libjpeg62-turbo-dev libpng-dev && \ docker-php-ext-configure gd --with-freetype --with-jpeg && \ docker-php-ext-install -j$(nproc) gd && \ docker-php-ext-install zip # Clear cache RUN apt-get clean && rm -rf /var/lib/apt/lists/* # Install Composer COPY --from=composer/composer:latest-bin /composer /usr/bin/composer # Set the COMPOSER_ALLOW_SUPERUSER environment variable ENV COMPOSER_ALLOW_SUPERUSER 1 # 设置工作目录 WORKDIR /app # 添加启动脚本 COPY start.sh /usr/local/bin/start.sh RUN chmod +x /usr/local/bin/start.sh # 默认执行启动脚本 CMD ["start.sh"]
2. 编写启动脚本start.sh(放在Dockerfile同目录下)
该脚本会先执行Composer依赖安装,再启动PHP-FPM以保持容器持续运行:
#!/bin/bash # 检查当前目录是否存在composer.json if [ -f /app/composer.json ]; then # 安装依赖(仅当vendor不存在或composer.lock有变更时更新) composer install --no-interaction --no-progress # 生成自动加载文件 composer dump-autoload fi # 启动PHP-FPM(替换当前进程,保证容器不会退出) exec php-fpm
3. 修改docker-compose.yml,调整PHP服务配置
version: '3.8' services: NGinX: image: nginx:latest container_name: NGinX hostname: NGinX security_opt: - no-new-privileges:true ports: - 80:80/tcp - 443:443/tcp dns: - 8.8.8.8 - 1.1.1.1 environment: - PUID=1000 - PGID=100 - TZ=Europe/London - UMASK=022 volumes: - /volume1/docker/WebDev/NGinX/nginx.conf:/etc/nginx/conf.d/nginx.conf - /volume1/docker/WebDev/WWW:/app restart: unless-stopped depends_on: - php php: build: context: . dockerfile: PHP.dockerfile container_name: PHP hostname: PHP security_opt: - no-new-privileges:true environment: - PUID=1000 - PGID=100 - TZ=Europe/London - UMASK=022 # 可选:设置Composer缓存目录,加速后续安装 - COMPOSER_CACHE_DIR=/tmp/composer-cache volumes: - /volume1/docker/WebDev/WWW:/app - /volume1/docker/WebDev/PHP/local-php.ini:/usr/local/etc/php/conf.d/local.ini # 可选:挂载Composer缓存卷,避免重复下载依赖包 - composer-cache:/tmp/composer-cache restart: unless-stopped # 定义Composer缓存卷 volumes: composer-cache:
关键说明
- 启动脚本的作用:容器启动时本地卷已挂载完成,此时执行
composer install会直接在挂载的/app目录生成vendor,不会被卷覆盖;最后用exec php-fpm替换当前进程,确保容器持续运行(不会执行完Composer就退出)。 - 移除构建时的代码复制:本地卷已挂载代码目录,构建镜像时复制代码无意义,还会增大镜像体积。
- Composer缓存卷:单独挂载缓存卷可避免每次启动都重新下载依赖,大幅提升启动速度。
- 权限问题:确保本地
/volume1/docker/WebDev/WWW目录的权限与容器内PUID/PGID一致,避免Composer生成的文件权限异常。
额外优化建议
在项目根目录创建.dockerignore文件,排除不必要的文件,减少镜像构建时间:
vendor/ composer.lock .git/ .dockerignore Dockerfile docker-compose.yml
内容的提问来源于stack exchange,提问作者PHP Addict
相关产品推荐
相关产品推荐

