Jedním z běžných případů použití kanálů CI je vytváření obrazů Docker, které použijete k nasazení své aplikace. GitLab CI je pro to skvělou volbou, protože podporuje integrovanou službu pull proxy, což znamená rychlejší kanály a vestavěný registr pro ukládání vašich vytvořených obrázků.
V této příručce vám ukážeme, jak nastavit sestavení Dockeru, která používají obě výše uvedené funkce. Kroky, které musíte provést, se mírně liší v závislosti na typu spouštěče GitLab Runner, který pro svůj kanál použijete. Níže se budeme zabývat exekutory Shell a Docker.
Vytváření pomocí nástroje Shell Executor
Pokud používáte spouštěcí program Shell, ujistěte se, že máte na počítači, který hostí váš běžec, nainstalovaný Docker. Exekutor funguje tak, že spouští běžné příkazy shellu pomocí docker
binární na hostiteli Runnera.
Přejděte do úložiště Git pro projekt, pro který chcete vytvářet obrazy. Vytvořte .gitlab-ci.yml
soubor v kořenovém adresáři úložiště. Tento soubor definuje kanál GitLab CI, který se spustí, když do projektu vložíte změny.
Přidejte do souboru následující obsah:
stages: - build docker_build: stage: build script: - docker build -t example.com/example-image:latest . - docker push example.com/example-image:latest
Tato zjednodušená konfigurace je dostatečná k tomu, aby demonstrovala základy vytváření bitových kopií pomocí potrubí. GitLab automaticky naklonuje vaše úložiště Git do prostředí sestavení, takže spustíte docker build
použije Dockerfile
vašeho projektu a zpřístupnit obsah úložiště jako kontext sestavení.
Po dokončení sestavení můžete docker push
obrázek do vašeho registru. V opačném případě by byl dostupný pouze pro místní instalaci Dockeru, která spustila sestavení. Pokud používáte soukromý registr, spusťte docker login
nejprve zadejte správné ověřovací údaje:
script: - docker login -u $DOCKER_REGISTRY_USER -p $DOCKER_REGISTRY_PASSWORD
Definujte hodnoty dvou proměnných pověření tak, že ve webovém uživatelském rozhraní GitLab přejděte do části Nastavení> CI/CD> Proměnné. Kliknutím na modré tlačítko „Přidat proměnnou“ vytvoříte novou proměnnou a přiřadíte jí hodnotu. GitLab tyto proměnné zpřístupní v prostředí shellu používaném ke spuštění vaší úlohy.
Vytváření pomocí nástroje Docker Executor
Prováděcí nástroj GitLab Runner’s Docker se běžně používá k zajištění zcela čistého prostředí pro každou úlohu. Úloha se spustí v izolovaném kontejneru, takže docker
binární na hostiteli Runner bude nepřístupné.
Exekutor Docker vám nabízí dvě možné strategie pro vytváření vašeho obrazu:buď použijte Docker-in-Docker, nebo připojte hostitelský Docker socket do prostředí sestavení Runneru. Poté použijete oficiální obrázek kontejneru Docker jako obrázek své úlohy, čímž vytvoříte docker
příkaz dostupný ve vašem skriptu CI.
Docker-in-Docker
Použití Docker-in-Docker (DinD) k vytváření obrázků vám poskytne plně izolované prostředí pro každou úlohu. Proces Docker, který provádí sestavení, bude potomkem kontejneru, který GitLab Runner vytvoří na hostiteli pro spuštění úlohy CI.
Chcete-li používat DinD, musíte zaregistrovat svůj spouštěč GitLab Runner Docker s povoleným privilegovaným režimem. Přidejte --docker-privileged
příznak při registraci svého běžce:
sudo gitlab-runner register -n --url https://example.com --registration-token $GITLAB_REGISTRATION_TOKEN --executor docker --description "Docker Runner" --docker-image "docker:20.10" --docker-volumes "/certs/client" --docker-privileged
V rámci kanálu CI přidejte docker:dind
image jako službu. Díky tomu je Docker dostupný jako samostatný obrázek, který je propojen s obrázkem úlohy. Budete moci použít docker
příkaz k vytvoření obrázků pomocí instance Docker v docker:dind
kontejner.
services: - docker:dind docker_build: stage: build image: docker:latest script: - docker build -t example-image:latest .
Pomocí DinD získáte plně izolované sestavení, které se nemohou navzájem ani vašeho hostitele ovlivňovat. Hlavní nevýhodou je složitější chování při ukládání do mezipaměti:každá úloha získá nové prostředí, kde dříve vytvořené vrstvy nebudou přístupné. Částečně to můžete vyřešit tak, že se před sestavením pokusíte stáhnout předchozí verzi obrázku a poté pomocí --cache-from
build flag, aby byly vrstvy vytaženého obrázku dostupné jako zdroj mezipaměti:
docker_build: stage: build image: docker:latest script: - docker pull $CI_REGISTRY_IMAGE:latest || true - docker build --cache-from $CI_REGISTRY_IMAGE:latest -t $CI_REGISTRY_IMAGE:latest .
Uchycení patice
Připojení soketu Docker vašeho hostitele do prostředí vaší úlohy je alternativní možností, když používáte spouštěč Docker. To umožňuje bezproblémové ukládání do mezipaměti a odstraňuje nutnost přidávat docker:dind
služby vaší konfiguraci CI.
Chcete-li to nastavit, zaregistrujte svůj Runner pomocí docker-volumes
příznak, který spojuje soket Docker hostitele s /var/run/docker.sock
uvnitř pracovních kontejnerů:
sudo gitlab-runner register -n --url https://example.com --registration-token $GITLAB_REGISTRATION_TOKEN --executor docker --description "Docker Runner" --docker-image "docker:20.10" --docker-volumes /var/run/docker.sock:/var/run/docker.sock
Nyní úlohy spouštěné pomocí docker
image bude moci používat docker
binárně jako normálně. Operace budou ve skutečnosti probíhat na vašem hostitelském počítači a místo dětí se stanou sourozenci kontejneru úlohy.
To je v podstatě podobné použití spouštěcího programu shellu s instalací Docker vašeho hostitele. Obrázky budou umístěny na hostiteli, což usnadní bezproblémové používání běžného docker build
ukládání do mezipaměti vrstvy.
I když tento přístup může vést k vyššímu výkonu, menší konfiguraci a žádnému z omezení DinD, přichází s vlastními jedinečnými problémy. Nejvýraznější z nich jsou bezpečnostní důsledky:úlohy mohou spouštět libovolné příkazy Dockeru na vašem hostiteli Runner, takže škodlivý projekt ve vaší instanci GitLab může spustit docker run -it malicious-image:latest
nebo docker rm -f $(docker ps -a)
s ničivými následky.
GitLab také varuje, že vazba soketu může způsobit problémy, když úlohy běží souběžně. K tomu dochází, když se spoléháte na vytváření kontejnerů s konkrétními názvy. Pokud dvě instance úlohy běží paralelně, druhá selže, protože název kontejneru již na vašem hostiteli existuje.
Pokud očekáváte, že některý z těchto problémů bude problematický, měli byste místo toho zvážit použití DinD. I když se DinD již obecně nedoporučuje, může mít větší smysl pro veřejně přístupné instance GitLab, které spouštějí souběžné úlohy CI.
Odesílání obrázků do registru GitLab
Projekty GitLab mají možnost integrovaného registru, který můžete použít k ukládání obrázků. Obsah registru můžete zobrazit tak, že přejdete na Packages &Registries> Container Registry na postranním panelu vašeho projektu. Pokud tento odkaz nevidíte, povolte registr tak, že přejdete do Nastavení> Obecné> Viditelnost, Projekt, Funkce a oprávnění a aktivujete přepínač „Registr kontejnerů“.
GitLab automaticky nastavuje proměnné prostředí ve vašich úlohách CI, které vám umožní odkazovat na registr kontejnerů vašeho projektu. Upravte script
sekce pro přihlášení do registru a odeslání vašeho obrázku:
script: - docker login -u gitlab-ci-token -p $CI_JOB_TOKEN $CI_REGISTRY - docker build -t $CI_REGISTRY_IMAGE:latest . - docker push $CI_REGISTRY_IMAGE:latest
GitLab generuje zabezpečenou sadu přihlašovacích údajů pro každou z vašich úloh CI. $CI_JOB_TOKEN
proměnná prostředí bude obsahovat přístupový token, který může úloha použít k připojení k registru jako gitlab-ci-token
uživatel. Adresa URL serveru registru je dostupná jako $CI_REGISTRY
.
Poslední proměnná, $CI_REGISTRY_IMAGE
, poskytuje úplnou cestu k registru kontejnerů vašeho projektu. Toto je vhodný základ pro vaše obrázkové značky. Tuto proměnnou můžete rozšířit a vytvářet dílčí repozitáře, například $CI_REGISTRY_IMAGE/production/api:latest
.
Ostatní klienti Dockeru mohou stahovat obrázky z registru ověřením pomocí přístupového tokenu. Můžete je vygenerovat na obrazovce Nastavení> Přístupové tokeny vašeho projektu. Přidejte read_registry
rozsah, poté použijte zobrazené přihlašovací údaje k docker login
do registru vašeho projektu.
Použití proxy pro závislost GitLab
Závislost proxy GitLab poskytuje mezipaměťovou vrstvu pro upstream obrázky, které stahujete z Docker Hub. Pomáhá vám zůstat v rámci limitů rychlosti Docker Hub tím, že stahuje obsah obrázků pouze tehdy, když se skutečně změnily. To také zlepší výkon vašich sestavení.
Závislost proxy se aktivuje na úrovni skupiny GitLab tak, že přejdete do Nastavení> Balíčky a registry> Závislost Proxy. Jakmile bude povolena, přidejte do .gitlab-ci.yml
odkazy na obrázky. soubor s $CI_DEPENDENCY_PROXY_GROUP_IMAGE_PREFIX
vytáhnout je přes proxy:
docker_build: stage: build image: $CI_DEPENDENCY_PROXY_GROUP_IMAGE_PREFIX/docker:latest services: - name: $CI_DEPENDENCY_PROXY_GROUP_IMAGE_PREFIX/docker:dind alias: docker
To je všechno! GitLab Runner se automaticky přihlásí do registru závislých proxy, takže není nutné ručně zadávat vaše přihlašovací údaje.
GitLab nyní uloží vaše obrázky do mezipaměti, což vám poskytne lepší výkon a odolnost vůči výpadkům sítě. Všimněte si, že services
definice musela být také upravena – proměnné prostředí nefungují s vloženým formulářem použitým dříve, takže celý obrázek name
musí být zadán a poté příkaz alias
na odkaz ve vašem script
sekce.
I když jsme nyní nastavili proxy pro obrázky přímo používané v našich fázích zakázky, je potřeba více práce, abychom přidali podporu pro základní obrázek v Dockerfile
postavit. Běžná instrukce, jako je tato, neprojde přes proxy:
FROM ubuntu:latest
Chcete-li přidat tento poslední kus, použijte argumenty sestavení Dockeru, abyste při procházení souboru Docker zpřístupnili adresu URL závislého proxy:
ARG GITLAB_DEPENDENCY_PROXY FROM ${GITLAB_DEPENDENCY_PROXY}/ubuntu:latest
Poté upravte docker build
příkaz k definování hodnoty proměnné:
script: > - docker build --build-arg GITLAB_DEPENDENCY_PROXY=${CI_DEPENDENCY_PROXY_GROUP_IMAGE_PREFIX} -t example-image:latest .
Nyní bude váš základní obrázek natažen také přes proxy server.
Přehled
Sestavení obrazu Dockeru lze snadno integrovat do vašich kanálů CI GitLab. Po počáteční konfiguraci Runner docker build
a docker push
příkazy ve script
vaší úlohy sekce jsou vše, co potřebujete k vytvoření obrázku pomocí Dockerfile
ve vašem úložišti. Vestavěný registr kontejnerů GitLab vám poskytuje soukromé úložiště pro obrázky vašeho projektu.
Kromě základních sestavení stojí za to integrovat proxy server GitLab, abyste urychlili výkon a předešli překročení limitů rychlosti Docker Hub. Měli byste také zkontrolovat zabezpečení vaší instalace posouzením, zda vámi vybraná metoda umožňuje nedůvěryhodným projektům spouštět příkazy na vašem hostiteli Runner. Přestože má své vlastní problémy, Docker-in-Docker je nejbezpečnější přístup, když je vaše instance GitLab veřejně přístupná nebo k ní má přístup velká uživatelská základna.