GNU/Linux >> Znalost Linux >  >> Panels >> Docker

Jak vytvářet obrazy Dockeru v GitLab CI Pipeline

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.


Docker
  1. Jak použít Dockerfile k vytvoření Docker Image

  2. Jak upravit obrázky Docker

  3. Úvod do Docker Images

  1. Jak přesunout obrazy Dockeru mezi hostiteli

  2. Jak vyhledávat, stahovat, seznamovat a odstraňovat obrázky Docker v systému Linux

  3. Jak automaticky vytvářet a konfigurovat vlastní obrázky dockeru pomocí Dockerfile – část 3

  1. Jak vytvořit kontejner Anaconda Python Data Science Docker

  2. Jak sdílet obrázky Docker s ostatními

  3. Jak používat místní docker obrázky s Minikube?