Docker Images über CI bauen und in die Registry legen

Hi zusammen,
ich möchte Docker Images über die CI bauen und in die Container Registry meines Projektes ablegen. Obwohl sich verschiedene Skripte mit Lösungen finden, schaffe ich es nicht ein Image zu bauen. Diese schlagen immer fehl mit „Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?“

Gibt es hierfür eine Anleitung ? Welche Einstellungen muss man unabhängig der Yaml vornehmen?

Im Forum bin ich bereits auf den Artikel (welcher veraltet aussieht) Docker Images in CI bauen und in Registry pushen gestoßen. Allerdings wird die Lösung um Kaniko nicht mehr maintained bzw. seitens GitLab nicht beworben. Von der Lösung mit Dind wird aus Sicherheitsbedenken abgeraten (Docker-in-Docker in Gitlab Runners | by Tony Wooster | Medium).

Eine entsprechendes Hello-World sieht bei mir derzeit so aus:

build:
  stage: build
  image: ${CI_DEPENDENCY_PROXY_GROUP_IMAGE_PREFIX}/docker:20.10.16
  services:
    - name: ${CI_DEPENDENCY_PROXY_GROUP_IMAGE_PREFIX}/docker:18.09.7-dind
      alias: docker
  script:
    - echo "$CI_REGISTRY_PASSWORD" | docker login $CI_REGISTRY -u $CI_REGISTRY_USER --password-stdin
    - docker build -t $CI_REGISTRY/hello_world:latest .
    - docker push $CI_REGISTRY/hello_world:latest
2 „Gefällt mir“

docker-in-docker (dind) wird von openCode nicht unterstützt.

Bisher war die Variante mit kaniko als Container Buildtool der Weg, um unter openCode Images zu bauen.

Aber seit kurzem wird kaniko nicht mehr von GitLab unterstützt, da kaniko nicht mehr aktiv gepflegt wird: Use kaniko to build Docker images (removed) | GitLab Docs

@oc000037236425 - Siehe Fragen unten:

Wie ist der gedachte Weg, um Container Images zu bauen? Ich denke, man wird in Fällen wie dagger.io nicht um den privilegierten Build von Container Images herumkommen. Der docker executor von dagger.io benötigt im dargestellten Beispiel (GitLab CI | Dagger) ebenfalls dind.

Für „normale“ Container Images: Was ist die Alternative zu kaniko? buildah?

2 „Gefällt mir“

Hallo @oc000037236425 - Gibt es dazu einen Stand bezüglich dieser Funktionen?

Ein anderes Szenario gibt es bei der Bereitstellung von kyverno Policies der IG-BvC anhand von SYS.1.6 und APP.4.4.

Die meisten Test funktionieren mit kyverno test. Jedoch benötigen einige wenige Tests ein echtes Kuberntes Cluster. Da jedoch kein privilegierter Modus zur Verfügung steht, kann kein ephemeral Cluster innerhalb einer Pipeline angelegt werden.

Einen eigenen GitLab Runner aufzusetzen ist keine Alternative, da man so die Zugangsinfos für alle Mitglieder des Projektes bzw. der Gruppe bekant geben würde.

Als Ausweg bleibt derzeit ein remote trigger zu einer Pipeline bei gitlab.com. Dort ist ein privilegierter Modus möglich und die Pipeline kann dort ein temporäres k3d Cluster anlegen.

Wenn der Workflow möglichst nahe am klassischen Docker bleiben soll, könnte vielleicht auch rootless Podman eine Option sein?

Scheinbar nicht ohne Weiteres :frowning:, vgl. builder_manual (#1342088) · Aufgaben · umwelt-info / metadaten · GitLab

Chainguard (mittlerweile Arbeitgeber zweier der ursprünglichen Kaniko-Entwickelnden) hat scheinbar auch Kaniko geforked, so dass „einfach mit neuem Image-Pfad weitermachen“ vermutlich auch eine Option wäre.

Insofern auch rootless BuildKit entsprechend https://docs.gitlab.com/ci/docker/using_buildkit/#migrate-from-kaniko-to-buildkit nicht ohne Weiteres auf den openCode-Runnern zu funktionieren scheint, würde ich jetzt vermutlich tatsächlich den Chainguard fork versuchen, allerdings muss man die Images scheinbar selbst bauen. (Hier wäre es natürlich schon, wenn openCode so ein Image zentral bereitstellen/pflegen könnte.)

Bin jetzt am Ende beim Community Fork von Kaniko gelandet:

Hier besteht auch die Möglichkeit, dass GitLab sich mittelfristig im Projekt engagiert, vgl. Future of rootless container builds in GitLab CI (Discussion only) (#38957) · Issues · GitLab.org / gitlab-runner · GitLab

Für den Fall des Build eines Images funktioniert die Vorgehensweise. Aber in anderen Szenarien wie die ephemeral Ausführung von z.b. k8s Testclustern werden dennoch oft root Privilegien benötigt.

Sicherlich, die Frage ist ob das Anwendungsfälle sind die openCode mit den Shared Runner abdecken muss. Prinzipiell spricht nichts dagegen für spezifische Zwecke spezifische Runner selbst zu betreiben und diese entsprechend getagged in den relevanten openCode/GitLab-Projekten zu registrieren.

Wenn z.b. kein „Arm“ via eigene Runner in das eigene RZ gewünscht sind, weil das Projekt oder Gruppe viele Members hat.

Niemand sagt, dass diese Runner im einem bestimmten RZ laufen müssen. Die Rechenkapazitäten kann ja auch anderswo laufen, zumindest so lange selbige ausreichend vertrauenswürdig ist.

Ich denke, dass es grundlegend wichtig ist, openCode bzw. das ZenDIS nicht mit allen irgendwie denkbaren Anforderungen zu überfrachten. Besser ist es die für 80% relevanten Anforderungen zu finden und zu bedienen. Sonst kommt am Ende so etwas wie die Betriebsumgebung am ITZBund raus, die zwar auch für die 10% kritischen Systeme geeignet wäre, aber für die 90% Brot-und-Butter-Systeme viel zu komplex und damit zu teuer ist.

In gewissem Sinne sind ein „RZ“ und „anderswo“ externe compute resources. Daher also das gleiche.

Im ernsthaften produktiven Betrieb sind realitätsnahe Testläufe durchaus keine Seltenheit, sondern eine MUSS Anforderung. Daher stammt der Fall einer realitätsnahen Testumgebung direkt aus der Praxis.

Würde das nicht zusätzlich für Runner in der eigentlichen Betriebsumgebung sprechen? Dann halt entsprechend isoliert. Die Betriebsumgebung die openCode zentral bereitstellt würde gerade nicht realitätsnah sein wenn die System dann auf einer ganz anderen Infrastruktur eingesetzt werden.

Ja, damit sind wir wieder am Anfang der Diskussion.

Gibt es hierzu mittlerweile eine Lösung? Also eine abseits von der Option die Images lokal zu bauen und in der opencode registry zu hinterlegen. Wenn nicht, sollten wir OpenCode bitten dafür eine Lösung bereitzustellen.

1 „Gefällt mir“

Wir nutzen jetzt seit einiger Zeil des osscontainertools-Fork von Kaniko um unsere Container Images via openCode GitLab zu bauen und haben damit soweit keine Probleme.