Docker多阶段构建如何避免前阶段目录被覆盖?
解决Docker多阶段构建中前阶段文件丢失的问题
这个问题是多阶段构建的典型误区——第二阶段的镜像完全基于node:12的干净环境,第一阶段安装的所有内容默认不会自动继承,所以你运行容器时自然找不到usd_from_gltf命令。
要解决这个问题,我们需要在第二阶段主动复制第一阶段的关键文件和依赖,同时同步必要的环境变量。下面是修改后的完整Dockerfile,我会标注核心改动:
# 第一阶段:构建并安装usd_from_gltf,给这个阶段起别名方便后续引用 FROM leon/usd:latest AS ufg-builder WORKDIR /usr/src/ufg # Configuration ARG UFG_RELEASE="3bf441e0eb5b6cfbe487bbf1e2b42b7447c43d02" ARG UFG_SRC="/usr/src/ufg" ARG UFG_INSTALL="/usr/local/ufg" ENV USD_DIR="/usr/local/usd" ENV LD_LIBRARY_PATH="${USD_DIR}/lib:${UFG_SRC}/lib" ENV PATH="${PATH}:${UFG_INSTALL}/bin" ENV PYTHONPATH="${PYTHONPATH}:${UFG_INSTALL}/python" # Build + install usd_from_gltf RUN git init && \ git remote add origin https://github.com/google/usd_from_gltf.git && \ git fetch --depth 1 origin "${UFG_RELEASE}" && \ git checkout FETCH_HEAD && \ python "${UFG_SRC}/tools/ufginstall/ufginstall.py" -v "${UFG_INSTALL}" "${USD_DIR}" && \ cp -r "${UFG_SRC}/tools/ufgbatch" "${UFG_INSTALL}/python" && \ rm -rf "${UFG_SRC}" "${UFG_INSTALL}/build" "${UFG_INSTALL}/src" # 第二阶段:运行Node.js服务器,同时引入第一阶段的usd_from_gltf FROM node:12 WORKDIR /usr/src/app # 复制第一阶段安装好的usd_from_gltf和依赖的USD库 COPY --from=ufg-builder /usr/local/ufg /usr/local/ufg COPY --from=ufg-builder /usr/local/usd /usr/local/usd # 同步第一阶段的环境变量,确保命令和依赖库能被找到 ENV USD_DIR="/usr/local/usd" ENV LD_LIBRARY_PATH="${USD_DIR}/lib:/usr/local/ufg/lib" ENV PATH="${PATH}:/usr/local/ufg/bin" ENV PYTHONPATH="${PYTHONPATH}:/usr/local/ufg/python" # 继续原有的Node.js服务构建步骤 COPY package.json ./ RUN yarn install COPY . . CMD ["yarn", "start"]
关键改动说明:
- 给第一阶段起别名:用
AS ufg-builder标记第一阶段,这样第二阶段可以通过--from=ufg-builder精准引用它的文件。 - 复制核心文件:通过
COPY --from=ufg-builder把第一阶段安装的/usr/local/ufg(usd_from_gltf的安装目录)和/usr/local/usd(依赖的USD库)复制到第二阶段镜像中。 - 同步环境变量:在第二阶段重新设置
PATH、LD_LIBRARY_PATH等环境变量,确保系统能找到usd_from_gltf命令和它依赖的动态库。
验证方法:
你可以先启动容器并进入交互式模式,测试命令是否可用:
docker run -it --rm <your-image-name> bash
然后在容器内执行usd_from_gltf --version,如果能正常输出版本信息,说明配置成功,再启动Node服务即可。
内容的提问来源于stack exchange,提问作者Filip
相关产品推荐
相关产品推荐

