Docker构建执行git clone后运行composer install失败问题咨询
问题根因
Dockerfile 中每一条 RUN 指令都会在独立的 shell 环境中执行,单条命令执行完成后工作目录会自动重置为当前 WORKDIR 的值。你写的 RUN cd CREATEDFOLDER 仅在对应的单条shell进程中生效,进程结束后工作目录就回到了 /app,后续的 git init、git remote add、git pull 操作实际都是在 /app 目录下执行的,代码根本没有拉取到 /app/CREATEDFOLDER 路径下,所以后续切换到该目录运行 composer install 时自然找不到代码文件。
Dockerfile 本身是严格顺序执行指令的,前一条指令执行成功(退出码为0)才会运行下一条,不存在克隆操作未完成就执行后续步骤的情况,不需要额外添加等待逻辑。
修复方案
方案1:合并路径切换与Git操作
将cd命令和后续的Git操作合并到同一条 RUN 指令中,保证路径切换持续生效:
FROM php:7.3 RUN apt-get update -y && apt-get install -y openssl zip unzip git RUN curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer RUN docker-php-ext-install pdo pdo_mysql WORKDIR /app/ RUN mkdir CREATEDFOLDER # 合并命令保证路径切换生效 RUN cd CREATEDFOLDER && \ git init && \ git remote add origin https://USERNAME:PASSWORD@github.com/USER/REPO.git && \ git pull origin dev WORKDIR /app/CREATEDFOLDER/ RUN composer install EXPOSE 8000 CMD php artisan serve --host=0.0.0.0
方案2:直接切换工作目录执行Git操作
更简洁的写法是直接把 WORKDIR 切换到目标目录后执行Git操作,不需要额外的cd命令:
FROM php:7.3 RUN apt-get update -y && apt-get install -y openssl zip unzip git RUN curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer RUN docker-php-ext-install pdo pdo_mysql # 直接切换到目标目录,自动创建不存在的文件夹 WORKDIR /app/CREATEDFOLDER RUN git init && \ git remote add origin https://USERNAME:PASSWORD@github.com/USER/REPO.git && \ git pull origin dev RUN composer install EXPOSE 8000 CMD php artisan serve --host=0.0.0.0
额外优化建议
不要把GitHub的账号密码硬编码到Dockerfile中,会有严重的凭证泄露风险,建议使用构建参数动态传递凭证,不要把敏感信息固化到镜像层里。
关于拆分Composer独立容器的说明
如果需要拆分也可以实现,在docker-compose.yml中可以通过 depends_on 配置依赖关系,结合共享卷把代码同步给各个服务,不过你的当前场景仅需要修正Dockerfile写法即可解决问题,不需要额外拆分容器。
内容的提问来源于stack exchange,提问作者Nattcrawler
相关产品推荐
相关产品推荐

