如何使用GitLab Auto DevOps部署多容器应用并修复构建路径报错
问题核心原因
GitLab Auto DevOps默认的Auto Build阶段,构建上下文固定为项目根目录,DOCKERFILE_PATH变量仅用于指定Dockerfile的读取位置,不会自动切换构建上下文到Dockerfile所在目录,所以Dockerfile中用相对路径引用的同目录文件,会从项目根目录查找,自然找不到。
可直接使用的解决方法
方案1:修改Dockerfile中的文件引用路径(改动最小)
如果不想调整CI配置,直接修改两个Dockerfile的COPY语句,把文件路径改为相对于项目根目录的路径即可:
- 若Streamlit应用Dockerfile在
src/app/Dockerfile,同目录的requirements.txt,就把原来的COPY requirements.txt .改为COPY src/app/requirements.txt . - 若Nginx的Dockerfile在
src/nginx/Dockerfile,同目录的project.conf,就把原来的COPY project.conf /etc/nginx/conf.d/改为COPY src/nginx/project.conf /etc/nginx/conf.d/
该方案无需调整CI配置,适合新手快速验证构建逻辑。
方案2:自定义Auto Build的构建上下文(更符合常规Docker构建习惯)
如果你想保留Dockerfile里的相对路径写法,就需要覆盖GitLab默认的Auto Build逻辑,给docker build命令指定上下文路径。你可以在.gitlab-ci.yml中加入以下配置,覆盖默认的build任务:
# 先引入默认的Auto DevOps模板 include: - template: Auto-DevOps.gitlab-ci.yml # 覆盖默认的build任务,拆分为两个独立的容器构建任务 build: stage: build image: docker:latest services: - docker:dind variables: DOCKER_DRIVER: overlay2 parallel: matrix: - IMAGE_NAME: streamlit-app DOCKERFILE_PATH: src/app/Dockerfile BUILD_CONTEXT: src/app - IMAGE_NAME: nginx-proxy DOCKERFILE_PATH: src/nginx/Dockerfile BUILD_CONTEXT: src/nginx script: # 登录GitLab容器镜像仓库 - echo "$CI_REGISTRY_PASSWORD" | docker login $CI_REGISTRY -u $CI_REGISTRY_USER --password-stdin # 构建镜像,指定上下文为BUILD_CONTEXT对应的目录 - docker build -f $DOCKERFILE_PATH -t $CI_REGISTRY_IMAGE/$IMAGE_NAME:$CI_COMMIT_SHORT_SHA $BUILD_CONTEXT # 推送镜像到仓库 - docker push $CI_REGISTRY_IMAGE/$IMAGE_NAME:$CI_COMMIT_SHORT_SHA
该配置会分别为两个容器执行构建,构建上下文就是各自Dockerfile所在的目录,原有Dockerfile里的相对路径写法完全不用修改。
内容的提问来源于stack exchange,提问作者Durand
相关产品推荐
相关产品推荐

