Ausführen experimenteller Docker-Funktionen auf CircleCI

11

Wenn ein Build auf CircleCI gestartet wird, ist eines der ersten Dinge, die getan werden:

Richten Sie eine Remote-Docker-Engine ein

Specified reusable docker engine, but build has not been whitelisted.
Contact CircleCI to be whitelisted
Allocating a remote Docker Engine
...
Remote Docker engine created. Using VM 'prealloc-wrjtu1qd-1491949826270'
Created container accessible with:
  DOCKER_TLS_VERIFY=1
  DOCKER_HOST=tcp://<IP>:2376
  DOCKER_CERT_PATH=/tmp/docker-certs615987123
  DOCKER_MACHINE_NAME=51123

Wenn anschließend docker build --squash -t imagename .auf CircleCI ausgeführt wird, ergibt sich Folgendes:

Error response from daemon: squash is only supported with experimental mode
Exited with code 1

Diskussion

Es funktioniert, um experimentelle Funktionen lokal zu verwenden, nachdem /etc/docker/daemon.jsonFolgendes geändert wurde:

{
    "experimental": true
}

und Neustart des Docker-Systemctl-Dienstes, aber wie geht das auf CircleCI? Dies scheint unmöglich zu sein, da die Build-Ausgabe angibt, dass eine Verbindung zu einem Remote-Docker hergestellt wurde, der sich auf den CircleCI-Systemen befindet.

030
quelle

Antworten:

5

Sie stoßen auf die Einschränkungen von verwalteten Diensten. Viele verwaltete Dienste eignen sich hervorragend, um mit Ideen zu experimentieren, und können für den Gelegenheitsbenutzer einen hohen Wert darstellen. Sie tauschen jedoch Benutzerfreundlichkeit gegen Flexibilität und Funktionalität aus. Sobald wir ernsthafte Bedürfnisse haben und bereit sind, erhebliche Anstrengungen zu unternehmen, um auf diesen Ideen aufzubauen, sollten wir uns zunächst für ein flexibles a entscheiden voll funktionsfähige Lösung. Meines Erachtens treffen Sie die Grenze, an der Sie nach etwas anderem suchen müssen - und Sie werden feststellen, dass Sie ein anderes Tool erlernen müssen, da dies keine freie Software ist und Sie es nicht selbst ausführen können.

Hier geht es um Circle CI, aber die folgenden Einschränkungen gelten für viele verwaltete Dienste:

  • Managed Services stellen eine harte Einschränkung für Softwareversionen dar, die wir verwenden können. Diese Einschränkungen entsprechen möglicherweise unseren heutigen Anforderungen, müssen dies jedoch zu einem späteren Zeitpunkt nicht mehr tun. Möglicherweise sind sie heute bereits nicht mehr synchron. In jedem Fall ist dies häufig ein Show-Stopper, da die Unfähigkeit, dieselben Softwareversionen in der Entwicklungsumgebung und in der verwalteten Umgebung zu verwenden, eine nutzlose Quelle für Fehler und Schwierigkeiten aller Art ist.

  • Managed Services bieten eingeschränkten Zugriff auf ihre Funktionen. Dies ist das Problem, mit dem Sie hier konfrontiert sind: Sie möchten Docker ausführen, haben jedoch keinen Zugriff auf den Dämon, sondern nur auf eine Teilmenge seiner Funktionen. Diese Einschränkungen werden manchmal durch Werbematerial nicht gut dokumentiert oder in vollem Umfang beleuchtet. Dies bedeutet nur, dass die Arbeit zum Verständnis und zur Integration dieser Funktionen wertlos ist, bis wir den verwalteten Dienst verlassen, um eine andere bessere Lösung zu finden.

  • Managed Services bieten eingeschränkten Zugriff auf die dort gespeicherten Daten. Um das Beispiel der verwalteten Dienste für die Protokollierung und Überwachung zu nennen: Der Datenzugriff ist langsam, unpraktisch und umfangreich. Wenn wir unsere Infrastruktur betreiben, können wir jede ausgefallene benutzerdefinierte Analyse unserer Überwachungsartefakte durchführen, da Daten leichter zu erreichen sind.

Beachten Sie, dass dies bei verwalteten Diensten nicht der Fall ist. Eine Hand von ihnen ist in der Lage, Benutzerfreundlichkeit mit Flexibilität und Funktionalität zu kombinieren. Viele dieser Dienste sind jedoch einfach zu bedienen, um Flexibilität und Funktionalität zu gewährleisten: Wir können sie als Hilfsmittel verwenden, um schnell eine einfache Funktionalität aufzubauen, aber sie verhindern, dass wir über diesen Punkt hinausgehen. Wir müssen uns dieses Kompromisses bewusst sein und darüber nachdenken.

Michael Le Barbier Grünewald
quelle
7

Mit CircleCI können Sie jetzt einen Maschinen-Executor verwenden, der eine separate VM für Sie bereitstellt, wobei Ubuntu 14.04 und Docker Version 17.06.0-ce installiert sind. Auf diese Weise können Sie experimentelle Funktionen für den Docker-Dämon aktivieren.

Sie müssen den machineSchlüssel anstelle des dockerSchlüssels verwenden, um Ihren Job in einer separaten virtuellen Maschine anstatt nur in einem Docker-Container auszuführen.

Sie können nur 2 Bilder für das Gerät auswählen:

  • circleci/classic:latest: Ubuntu 14.04 mit Docker 17.03.0-ce oder
  • circleci/classic:edge: Ubuntu 14.04 mit Docker 17.06.0-ce - das mit experimentellen Funktionen.

Sie müssen auch Abhängigkeiten auf dem Computer selbst installieren, da dies ziemlich einfach ist. Wenn Sie beispielsweise PHP für Ihre Tests benötigen, müssen Sie ausführen sudo apt-get install -y php5.

Hier ist ein Beispiel für .circleci / config.yml , das mithilfe der experimentellen Funktion ein Docker-Image erstellt docker build --squash:

.circleci / config.yml

version: 2
jobs:
  build:
    # Run in a separate virtual machine instead of a Docker container.
    machine:
      enabled: true
      # Use Ubuntu 14.04 with bleeding edge Docker daemon 17.06.0-ce.
      image: circleci/classic:edge
    steps:
      - checkout
      - run:
          command: |
            # Restart Docker with experimental features on.
            sudo sh -c 'echo '\''DOCKER_OPTS="--experimental=true"'\'' >> /etc/default/docker'
            sudo service docker restart

            # Install dependencies for tests etc.
            sudo apt-get update
            sudo apt-get install -y php5

            # Build image with experimental feature --squash.
            docker build --squash -t myuser/myimage .

            # Login and push Docker image to registry.
            docker login -u $DOCKER_USER -p $DOCKER_PASS
            docker push myuser/myimage
Eugene Sia
quelle
1
Dies sollte die akzeptierte Antwort sein. Funktioniert sehr gut in Circle CI. Ich habe gerade mein 1 GB schlankes Bild auf 180 MB reduziert.
pista329