You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.20 18:06:01