Come eseguire le funzionalità Docker sperimentali su CircleCI


12

Quando una build viene avviata su CircleCI, una delle prime cose che viene fatta è:

Installa un motore Docker remoto

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

Successivamente, quando docker build --squash -t imagename .viene eseguito su CircleCI, si ottiene:

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

Discussione

Funziona per utilizzare le funzionalità sperimentali localmente dopo aver modificato /etc/docker/daemon.jsonquanto segue:

{
    "experimental": true
}

e riavviando il servizio docker systemctl, ma come farlo su CircleCI? Sembra impossibile poiché l'output di compilazione indica che è stata stabilita una connessione a una finestra mobile remota che risiede sui sistemi CircleCI.

Risposte:


5

Stai incontrando i limiti dei servizi gestiti. Molti servizi gestiti sono ottimi per iniziare a sperimentare idee e possono mostrare un grande valore per l'utente occasionale. Ma scambiano facilità d'uso per flessibilità e funzionalità, quindi non appena iniziamo ad avere bisogni seri e siamo pronti a spendere un notevole sforzo per sviluppare queste idee, la prima mossa che dovremmo fare è optare per una flessibilità soluzione completamente funzionale. A mio giudizio, stai raggiungendo la linea in cui devi cercare qualcos'altro - e noterai che devi imparare uno strumento diverso, perché non è un software libero e non puoi eseguirlo da solo.

Qui stiamo parlando di Circle CI, ma le seguenti limitazioni sono comuni a molti servizi gestiti:

  • I servizi gestiti mettono in grave contrasto le versioni del software che ci consentono di utilizzare. Questi vincoli possono corrispondere a ciò di cui abbiamo bisogno oggi, ma non è necessario in un secondo momento. Potrebbero essere già fuori sincrono oggi. In ogni caso, questo è spesso un ostacolo allo spettacolo, perché non essere in grado di utilizzare le stesse versioni del software in ambiente di sviluppo e in ambiente gestito è una fonte inutile di bug e difficoltà di ogni tipo.

  • I servizi gestiti forniscono accesso limitato alle loro funzionalità. Questo è il problema che stai affrontando qui: vuoi eseguire la finestra mobile, ma non hai accesso al demone, ma solo a un sottoinsieme delle sue funzioni. Queste limitazioni a volte non sono ben documentate né portate alla luce da materiale pubblicitario. Questo significa solo che il lavoro speso per comprendere e integrare queste funzionalità è inutile finché non lasciamo il servizio gestito per un'altra soluzione migliore.

  • I servizi gestiti forniscono accesso limitato ai dati che memorizziamo lì. Quindi, per prendere l'esempio dei servizi gestiti per la registrazione e il monitoraggio, l'accesso ai dati è lento, scomodo ed espansivo. Se gestiamo la nostra infrastruttura, siamo liberi di eseguire qualsiasi fantasia personalizzata sui nostri artefatti di monitoraggio, poiché i dati sono più facili da raggiungere.

Si noti che questo non è un caso contro i servizi gestiti. Una mano di loro è in grado di combinare facilità d'uso con flessibilità e funzionalità. Ma molti di questi servizi scambiano facilità d'uso per flessibilità e funzionalità: possiamo usarli come espediente per costruire rapidamente una semplice funzionalità ma ci impediranno di andare oltre quel punto. Dobbiamo essere consapevoli di questo compromesso e considerare.


8

CircleCI ora ti consente di utilizzare un esecutore di macchina che effettua il provisioning di una VM separata per te, con Ubuntu 14.04 e Docker versione 17.06.0-ce installati. Ciò consente di attivare le funzionalità sperimentali per il demone Docker.

È necessario utilizzare la machinechiave anziché la dockerchiave per eseguire il lavoro in una macchina virtuale separata anziché in un contenitore Docker.

Puoi scegliere solo 2 immagini per la macchina:

  • circleci/classic:latest: Ubuntu 14.04 con Docker 17.03.0-ce, o
  • circleci/classic:edge: Ubuntu 14.04 con Docker 17.06.0-ce - quello con funzionalità sperimentali.

Dovrai anche installare le dipendenze sul computer da solo, poiché è abbastanza nudo. Ad esempio, se hai bisogno di PHP per i tuoi test, dovrai eseguirlo sudo apt-get install -y php5.

Ecco un esempio .circleci / config.yml che crea un'immagine Docker usando la funzione sperimentale 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

1
Questa dovrebbe essere la risposta accettata. Funziona molto bene in Circle CI. Ho appena ottenuto la mia immagine sottile da 1 GB fino a 180 MB.
pista329
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.