我有以下 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影像
uj5u.com熱心網友回復:
總結一下評論:目標是從其他兩個存盤庫的內容中構建一個 docker 鏡像。因此,我們希望在同一構建階段使用 git 和 docker - 或者至少這是嘗試的嘗試。我在這里提供了不同的選項,可用于實作此目的。
選項 1:將獲取邏輯遷移到 Dockerfile
我會將此邏輯遷移到我的 Dockerfile 中,而不是搞亂構建映像。通常我有更簡單的方法來處理 Dockerfile 中的這些事情,即使它為 git 和洗掉添加了另一層 - 我比試圖弄亂包含 docker 和 git 的構建映像要快。
但這取決于您的 Dockerfile 和您使用的 Docker 基礎映像,使用 debian/alpine/etc 這很容易實作,他們有自己的包管理器。
選項 2:構建 docker 鏡像用于構建包含 docker 和 git
這個選項是我最不喜歡的。正確設定 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 構建。
這里需要注意的是artifacts指令,您可以使用該指令定義在下一階段/構建中可用的檔案。看看https://docs.gitlab.com/ee/ci/yaml/#artifacts,這是關于該指令的一個很好的資源。
選項 5:使用 git 子模塊
也可以將其他存盤庫添加為 git 子模塊,而不是手動進行結帳。可以將其視為指向其他 git 存盤庫的子目錄。附加了一個特殊的結帳行為,但是通過仔細查看子模塊,您應該很容易安靜地解決這個問題。
請注意還要設定 ,GIT_SUBMODULE_STRATEGY以便獲取這些內容。https://docs.gitlab.com/ee/ci/runners/configure_runners.html#git-submodule-strategy
uj5u.com熱心網友回復:
我必須在 docker 鏡像中安裝 git
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
關于從多個repos的src代碼制作圖片的方法
我更喜歡為 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,它可能不會利用快取。
Ofcuse 在本地 pc 上我可以使用快取機制,但在 gitlab docker 中我不確定如何使用它。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/323207.html
