【问题标题】:Problem with repository access from a docker container on a gitlab runner从 gitlab 运行器上的 docker 容器访问存储库的问题
【发布时间】:2020-09-14 18:20:28
【问题描述】:

tl;dr

与具有 docker 支持和已完成容器以及来自存储库的源代码的 gitlab 运行器一起工作的预期方式和理念是什么?如何将源代码存储库挂载到容器中?


我们目前正在将我们的 gitlab 运行器(本机)转换为具有 docker 支持的 gitlab 运行器。它们的工作原理不同,我仍然无法理解如何将它们用于我们的目的。 尽管问题有点宽泛,但我尝试将其限制在更具体的用例中。

假设我们想在一个编程项目(例如 Java 或 C++)中进行代码分析,这应该在推送到开发分支后定期进行。

第 1 阶段:构建容器 为此,我创建了一个 docker 文件并在那里组装所有必需的应用程序和库。我将这个容器推送到我们的注册表中,以便可以一次又一次地使用它。只有当我修改了 dockerfile 时,才应该重新构建它。

第 2 阶段:验证源代码 这一步要拉取Docker容器并分析源码。我的问题来了:容器如何从存储库中获取源代码?

我已经尝试通过-v 使用 docker 调用包含源代码文件夹,但它似乎不起作用。我收到-v 不是可执行程序的错误消息。所以我猜这种可能性不是故意的。

另一种可能性是在构建容器时集成源代码,但我认为这没有用。另一种可能性是通过config.toml 包含一条路径,类似于-v,但即使这样对我来说似乎也不是正确的解决方案。我只能通过ssh 访问配置文件。

另一种解决方案是通过 git 检查正在运行的容器中的源代码......也不漂亮。

长话短说:使用已完成的容器和来自存储库的源代码的预期方式和理念是什么?


我们将 gitlab 运行器与 shell 执行器一起使用。

variables:
  DOCKER_DRIVER: overlay2
  DOCKER_BUILDKIT: 1
  CI_REGISTRY: ***
  CI_REGISTRY_IMAGE: ***/test
  CI_REGISTRY_USER: ***
  CI_REGISTRY_PASSWORD: ***


stages:
- build
- test

before_script:
  - docker login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD $CI_REGISTRY

build_container:
  stage: build
  only:
    changes:
      - Dockerfile
  tags:
    - docker
  before_script:
    - docker pull $CI_REGISTRY_IMAGE:latest 
  script:
    - docker build --cache-from $CI_REGISTRY_IMAGE:latest -t $CI_REGISTRY_IMAGE .
  after_script:
    - docker push $CI_REGISTRY_IMAGE:latest

validate:
  stage: test
  script:
    - docker run $CI_REGISTRY_IMAGE /script/to/validate/code

【问题讨论】:

    标签: docker gitlab gitlab-ci gitlab-ci-runner


    【解决方案1】:

    好吧,我通过再次阅读Docker manual 解决了这个问题。 -v 的执行错误是因为参数放错了地方。下面的例子展示了正确的使用方法。

    解释:

    • --rm - 导致 Docker 在容器退出时自动移除容器
    • -v - 导致 Docker 将存储库/项目 $CI_PROJECT_DIR 挂载到容器的 /mnt

    代码sn-p:

    validate:
      stage: test
      tags:
        - docker
      script:
        - docker run --rm -v $CI_PROJECT_DIR:/mnt $CI_REGISTRY_IMAGE /bin/ash -c "/some/command /mnt/sourcecode/"
    

    【讨论】:

      【解决方案2】:

      我认为这种混淆源于将两个本应分开的事物混为一谈。

      如果您想重用 Docker 映像,则应在其自己的项目中构建和发布它。有些构建需要一段时间,因此您可以使用已构建的映像来节省时间。

      一旦您准备好要下拉的图像,您就可以继续使用该图像来做任何您想要的事情。

      您在 gitlab-ci.yml 文件中调用映像,然后它可以访问正在运行管道的项目的存储库。

      在 gitlab-ci.yml 中,您使用“图像”标签来指定您想要使用的 docker 图像。您可以为单个作业指定图像。

      image: python
      
      python job:
        script: python hello-world.py
      
      java job:
        image: golang
        script: go run hello-world.go
      

      【讨论】:

      • 您准确地描述了我实现它的方式,正如您在我的代码 sn-p 中看到的那样。显着的区别是执行者。您描述了docker executorDocker-in-Docker 场景中使用的行为。但我们使用的是不同的标准shell executor。使用此执行程序,您还没有安装 repo,并且image: 不可用。另见docs.gitlab.com/runner/executors/shell.html
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-12-16
      • 1970-01-01
      • 2021-02-27
      • 1970-01-01
      • 2016-12-14
      • 2017-04-17
      • 1970-01-01
      相关资源
      最近更新 更多