2017-03-21 3 views
1

Ich habe ein privates Gitlab auf meiner eigenen Maschine gehostet. Ich speichere meinen Code in Gitlab und möchte ein Docker-Image aus der Dockerfile erstellen und danach in meine Amazon ECR-Registry übertragen. Leider funktioniert das nicht, weil es einen Fehler wirft:Docker-Bild von Gitlab-CI zu Amazon AWS erstellen und schieben

Flag --email has been deprecated, will be removed in 1.13. 
Cannot connect to the Docker daemon. Is the docker daemon running on this host? 
/dev/mapper/control: open failed: Operation not permitted 
Failure to communicate with kernel device-mapper driver. 
Check that device-mapper is available in the kernel. 
Command failed 
mount: permission denied 
Could not mount /sys/kernel/security. 
AppArmor detection and --privileged mode might break. 
mkdir: cannot create directory '/sys/fs/cgroup/name=systemd': Read-only file system 
mount: mount point /sys/fs/cgroup/name=systemd is not a directory 
ln: failed to create symbolic link '/sys/fs/cgroup/systemd/name=systemd': Read-only file system 

Timed out trying to connect to internal docker host. 

Der Gitlab-ci-Code wie folgt aussieht:

stages: 
    - build 

build_airflow: 
    stage: build 
    only: [master, develop] 
    image: gitlab/dind:latest 
    services: 
    - docker:dind 
    script: 
    - APP=airflow 
    - sh ./scripts/login-ecs.sh my_fancy_project 

Das login-ecs.sh Skript einfach eval $(/usr/local/bin/aws ecr get-login --region eu-central-1) ausgeführt wird, die eine Anmeldung sollte das Bild in die Registrierungsdatenbank des Registrierungsschlüssels (Quelle: https://blog.madisonhub.org/gitlab-ci-build-how-to-login-to-ecr/).

Ich kann das Problem nicht finden, also hoffe ich, dass Sie mir helfen können.

Vielen Dank im Voraus.

PS: Wenn ich den Befehl von aws ecr get-login lokal ausführen, funktioniert es gut. Also sollte es etwas mit dem Gitlab zu tun haben. Muss ich einige Konfigurationen ändern, bei denen private Registrierungslogins erlaubt sind?

Antwort

2

Hintergrund:
Sie sind im Grunde ein Docker-Server innerhalb eines Docker Behälter zu laufen versuchen, die in Gitlab-ci nicht standardmäßig verfügbar ist.

docker version

in Ihrem Gitlab-ci-Skript: Sie können, indem Sie den Status des Docker Client und Server überprüfen. Dies ist im Allgemeinen eine gute Idee, um sicherzustellen, dass Client und Server ordnungsgemäß ausgeführt werden.

Sie werden feststellen, nachdem Sie das ausführen, dass der Docker Server nicht ausgeführt wird, weshalb Sie diesen Fehler bekommen: Cannot connect to the Docker daemon. Is the docker daemon running on this host?

Lösung:
Es gibt ein paar Möglichkeiten, um dieses Problem zu beheben Sie als ausführlich in der Dokumentation hier Gitlab beschrieben:
https://docs.gitlab.com/ce/ci/docker/using_docker_build.html

die Art, wie wir es gelöst die docker-in-docker executor verwendet, die Ihre Gitlab Runner Konfiguration beinhaltet die Aktualisierung und Ihren Build mit dem speziellen laufen cker-in-docker (dind) Docker Image.

Sie müssen den Runner aktualisieren, damit er in privilegierten Modus ausgeführt wird. Hier ist ein Beispiel config.toml:

[[runners]] 
    url = "https://gitlab.com/ci" 
    token = TOKEN 
    executor = "docker" 
    [runners.docker] 
    tls_verify = false 
    image = "docker:latest" 
    privileged = true 
    disable_cache = false 
    volumes = ["/cache"] 
    [runners.cache] 
    Insecure = false 

und verwenden Sie die Verwendung der docker:latest Bild und docker:dind Service. Hier ist ein Beispiel gitlab-ci.yaml Schnipsel:

image: docker:latest 

# When using dind, it's wise to use the overlayfs driver for 
# improved performance. 
variables: 
    DOCKER_DRIVER: overlay 

services: 
- docker:dind 

before_script: 
- docker info 

build: 
    stage: build 
    script: 
    - docker version 
    - docker build -t my-docker-image . 
    - docker run my-docker-image /script/to/run/tests 

Eine andere Methode zum Einrichten ist ein separater Docker Server, setzen Sie die Umgebungsvariablen DOCKER_TLS_VERIFY und DOCKER_HOST so Ihre Docker Client zum Server sicher verbinden kann.

TLS Damit Sie diese Anweisungen befolgen müssen:
https://docs.docker.com/engine/security/https/