我有以下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
映像
2条答案
按热度按时间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映像,其中您可以:
但是它增加了复杂性,并且比选择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-strategyoyjwcjzk2#
我不得不把git安装在docker映像里面
所以在脚本中我添加了
apk add git
关于从多个存储库的源代码创建映像的方法
我倾向于为DockerFile准备完整的上下文文件夹,然后构建它。
所以在
script
中我这样做的原因是,我们可以在构建图像时利用该高速缓存。所以如果10个步骤进行得很顺利,那么下次我构建图像时它会使用缓存的图层,并从第11个步骤开始。
因为在我们得到正确的图像之前,图像的构建需要对Dockerfile进行一些编辑。所以缓存图层是非常有帮助的。
如果我尝试在dockerfile中使用git clone,它可能不会利用该高速缓存。
当然,在本地PC上我可以使用该高速缓存机制,但是在gitlab docker中我不确定如何使用它。