Dockerfile中访问子目录执行composer install报错如何解决
问题根本原因
- Dockerfile中每个
RUN指令都会启动独立的shell进程,单条RUN cd <路径>执行完成后进程直接退出,后续的RUN指令会回到Dockerfile预设的WORKDIR路径,不会继承上一条RUN的目录切换结果 - 你当前的Dockerfile仅复制了根目录的
composer.json和composer.lock到容器,web/app/themes/sage目录本身及该目录下的composer配置文件并未复制到容器中,即使目录切换逻辑生效也会找不到目标路径
解决方案
步骤1:补全文件复制逻辑
在执行composer安装前,先把项目需要的子目录复制到容器对应路径:
# 复制根目录composer配置 COPY composer.json composer.lock ./ # 补充复制web目录下的所有内容(可根据实际需求调整复制范围,减少冗余文件) COPY ./web ./web
步骤2:修正目录切换逻辑
可选两种实现方式,优先选第一种减少镜像层数:
方式1:同一条RUN指令链式执行操作
# Switch to non-root 'app' user & install app dependencies COPY composer.json composer.lock ./ COPY ./web ./web RUN chown -R $NON_ROOT_USER:$NON_ROOT_GROUP $LARAVEL_PATH USER $NON_ROOT_USER # 根目录安装依赖后直接切换子目录安装,所有操作放在同一条RUN内 RUN composer install --prefer-dist --no-scripts --no-dev --no-autoloader \ && cd ./web/app/themes/sage \ && composer install --prefer-dist --no-scripts --no-dev --no-autoloader \ && rm -rf /home/$NON_ROOT_USER/.composer
方式2:用WORKDIR指令切换全局工作目录
# 根目录安装依赖 RUN composer install --prefer-dist --no-scripts --no-dev --no-autoloader # 全局切换工作目录到目标子目录,后续所有指令默认在该目录执行 WORKDIR $LARAVEL_PATH/web/app/themes/sage RUN composer install --prefer-dist --no-scripts --no-dev --no-autoloader # 完成后切回原工作目录 WORKDIR $LARAVEL_PATH RUN rm -rf /home/$NON_ROOT_USER/.composer
小提示:所有路径优先使用定义好的全局变量拼接的绝对路径,避免不同WORKDIR场景下相对路径匹配异常的问题。
内容的提问来源于stack exchange,提问作者Jeremy
相关产品推荐
相关产品推荐

