gitlab配置文件/CD:带有git的Docker图像

uinbv5nw  于 2022-11-22  发布在  Docker
关注(0)|答案(2)|浏览(105)

我有以下gitlab-ci.yaml

image: docker:19.03.13

variables:
  DOCKER_TLS_CERTDIR: "/certs"

services:
  - docker:19.03.13-dind

build-django_and_fastapi:
  before_script:
    - echo "$DOCKER_REGISTRY_PASS" | docker login $DOCKER_REGISTRY --username $DOCKER_REGISTRY_USER --password-stdin
  stage: build
  script:
    - mkdir test
    - cd test
    - git clone https://gitlab-ci-token:${CI_JOB_TOKEN}@gitlab.com/xxxx/yyyy.git
    - cd ..
    - docker build ./test

我得到了/bin/sh: eval: line xxx: git: not found
如何添加git包到docker:19.03.13映像

hpcdzsge

hpcdzsge1#

评论总结如下:我们的目标是从另外两个仓库的内容中构建一个docker映像。2因此我们希望在同一个构建阶段使用git和docker--或者至少这是尝试性的尝试。3我在这里提供了不同的选项,可以用来实现这一目标。

选项1:正在将提取逻辑迁移到Dockerfile中

与其在构建映像中乱转,我会将这些逻辑移植到我的Dockerfile中。通常我有更简单的方法在Dockerfile中处理这些事情,即使它为git和移除添加了另一层-我也比在构建映像中乱转要快,包含了docker和git。
但这取决于你的Dockerfile和你正在使用的Docker基础映像,用debian/alpine/etc这是很容易实现的,他们有自己的包管理器在船上。

选项2:为包含docker和git的构建构建docker映像

这个选项是我最不喜欢的一个。正确设置docker或者额外安装git总是有问题的。但是我也会在这里概述一下这个过程。
在这种情况下,您需要的是自己的Docker映像,其中您可以:

  • 选择docker映像并安装git
  • 选择一个git映像并安装docker
  • 建立一个全新的形象
  • (您可以随时尝试弄清楚使用哪个软件包管理器,并将其安装在脚本块中)

但是它增加了复杂性,并且比选择1更费力,并且比选择3提供更低的安全性。

选项3:使用API代替GIT(我的推荐方式)

除了使用git获取内容,还有API https://docs.gitlab.com/ee/api/repositories.html#get-file-archive
它允许你下载一个特殊的ref文件,比如zip/tar等等,这比git checkout更容易使用。这也可以和选项1结合使用,因为它允许通过curl轻松获取内容。
这个选项还有一个好处,不加载git的历史记录,只加载当前状态,这可能会缩短构建时间。

选项4:多个构建步骤

您可以将docker build和git checkout拆分为两个作业,而不是尝试合并这两个作业。第一个作业使用git,获取仓库,另一个作业用于docker build。
这里需要注意的是artifacts指令,你可以用它来定义哪些文件在下一个阶段/build中可用https://docs.gitlab.com/ee/ci/yaml/#artifacts。

选项5:使用git子模块

其他仓库也可以作为git子模块来添加,而不是手动 checkout 。这些子模块可以被看作是指向其他git仓库的子目录。这里附带了一个特殊的 checkout 行为,但是仔细研究一下子模块,你应该很容易就能发现这一点。
请注意,还要设置GIT_SUBMODULE_STRATEGY,以便获取这些值。https://docs.gitlab.com/ee/ci/runners/configure_runners.html#git-submodule-strategy

oyjwcjzk

oyjwcjzk2#

我不得不把git安装在docker映像里面

image: docker:19.03.13

variables:
  DOCKER_TLS_CERTDIR: "/certs"

services:
  - docker:19.03.13-dind

build-django_and_fastapi:
  stage: build
  script:
    - docker login -u gitlab-ci-token -p $CI_JOB_TOKEN registry.gitlab.com
    - apk update
    - apk add git
    - mkdir test
    - cd test
    - git clone https://gitlab-ci-token:${CI_JOB_TOKEN}@gitlab.com/xxxx/yyyy.git
    - cd ..
    - docker build ./test

所以在脚本中我添加了apk add git

关于从多个存储库的源代码创建映像的方法

我倾向于为DockerFile准备完整的上下文文件夹,然后构建它。
所以在script

script
  - make folders for src codes
  - clone the src codes into those folders
  - build the image using docker build

我这样做的原因是,我们可以在构建图像时利用该高速缓存。所以如果10个步骤进行得很顺利,那么下次我构建图像时它会使用缓存的图层,并从第11个步骤开始。
因为在我们得到正确的图像之前,图像的构建需要对Dockerfile进行一些编辑。所以缓存图层是非常有帮助的。
如果我尝试在dockerfile中使用git clone,它可能不会利用该高速缓存。
当然,在本地PC上我可以使用该高速缓存机制,但是在gitlab docker中我不确定如何使用它。

相关问题