Comment exécuter les fonctionnalités expérimentales de Docker sur CircleCI

12

Lorsqu'une construction est lancée sur CircleCI, l'une des premières choses à faire est:

Configurer un moteur Docker distant

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

Par la suite, lorsqu'il docker build --squash -t imagename .est exécuté sur CircleCI, il en résulte:

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

Discussion

Il fonctionne pour utiliser des fonctionnalités expérimentales localement après avoir modifié le /etc/docker/daemon.jsoncomme suit:

{
    "experimental": true
}

et redémarrer le service docker systemctl, mais comment faire cela sur CircleCI? Cela semble impossible car la sortie de la construction indique qu'une connexion est établie avec un docker distant qui réside sur les systèmes CircleCI.

030
la source

Réponses:

5

Vous rencontrez les limites des services gérés. De nombreux services gérés sont parfaits pour commencer à expérimenter des idées et peuvent présenter une grande valeur pour l'utilisateur occasionnel. Mais ils échangent la facilité d'utilisation pour la flexibilité et la fonctionnalité, donc dès que nous commençons à avoir des besoins sérieux et que nous sommes prêts à consacrer beaucoup d'efforts à développer ces idées, la première chose à faire est d'opter pour une solution entièrement fonctionnelle. À mon avis, vous atteignez la ligne où vous devez chercher autre chose - et vous remarquerez que vous devez apprendre un outil différent, car ce n'est pas un logiciel gratuit et vous ne pouvez pas l'exécuter vous-même.

Nous parlons ici de Circle CI, mais les limitations suivantes sont communes à de nombreux services gérés:

  • Les services gérés mettent une forte contrainte sur les versions logicielles qu'ils nous permettent d'utiliser. Ces contraintes peuvent correspondre à ce dont nous avons besoin aujourd'hui, mais ne doivent pas l'être ultérieurement. Ils sont peut-être déjà désynchronisés aujourd'hui. Dans tous les cas, il s'agit souvent d'un bouchon d'arrêt, car le fait de ne pas pouvoir utiliser les mêmes versions logicielles dans un environnement de développement et dans un environnement géré est une source inutile de bugs et de difficultés de toutes sortes.

  • Les services gérés offrent un accès restreint à leurs fonctionnalités. C'est le problème auquel vous êtes confronté ici: vous voulez exécuter docker, mais vous n'avez pas accès au démon, seulement à un sous-ensemble de ses fonctions. Ces limitations ne sont parfois pas bien documentées ni mises en évidence par le matériel publicitaire. Cela signifie simplement que le travail consacré à la compréhension et à l'intégration de ces fonctionnalités est sans valeur jusqu'à ce que nous quittions le service géré pour une autre meilleure solution.

  • Les services gérés offrent un accès restreint aux données que nous y stockons. Ainsi, pour prendre l'exemple des services gérés de journalisation et de surveillance, l'accès aux données est lent, peu pratique et extensif. Si nous gérons notre infrastructure, nous sommes libres d'exécuter toute analyse personnalisée de fantaisie sur nos artefacts de surveillance, car les données sont plus faciles à atteindre.

Notez que ce n'est pas un cas contre les services gérés. Certains d'entre eux sont capables de combiner facilité d'utilisation, flexibilité et fonctionnalité. Mais beaucoup de ces services facilitent l'utilisation de la flexibilité et de la fonctionnalité: nous pouvons les utiliser comme un moyen de construire rapidement une fonctionnalité simple, mais ils nous empêcheront d'aller au-delà de ce point. Nous devons être conscients de ce compromis et réfléchir.

Michael Le Barbier Grünewald
la source
8

CircleCI vous permet désormais d'utiliser un exécuteur de machine qui provisionne une machine virtuelle distincte pour vous, avec Ubuntu 14.04 et Docker version 17.06.0-ce installé. Cela vous permet d'activer des fonctionnalités expérimentales pour le démon Docker.

Vous devez utiliser la machineclé au lieu de la dockerclé pour exécuter votre travail sur une machine virtuelle distincte au lieu d'un simple conteneur Docker.

Vous ne pouvez choisir que 2 images pour la machine:

  • circleci/classic:latest: Ubuntu 14.04 avec Docker 17.03.0-ce, ou
  • circleci/classic:edge: Ubuntu 14.04 avec Docker 17.06.0-ce - celui avec des fonctionnalités expérimentales.

Vous devrez également installer les dépendances sur la machine vous-même, car elle est assez nue. Par exemple, si vous avez besoin de PHP pour vos tests, vous devrez exécuter sudo apt-get install -y php5.

Voici un exemple .circleci / config.yml qui construit une image Docker à l'aide d'une fonctionnalité expérimentale 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
la source
1
Cela devrait être la réponse acceptée. Fonctionne très bien dans Circle CI. Je viens de recevoir mon image mince de 1 Go à 180 Mo.
pista329