Como executar recursos experimentais do Docker no CircleCI

12

Quando uma construção é iniciada no CircleCI, uma das primeiras coisas que é feita é:

Configurar um mecanismo 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

Posteriormente, quando docker build --squash -t imagename .executado no CircleCI, resulta em:

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

Discussão

Ele trabalha para usar os recursos experimentais localmente após alterar o /etc/docker/daemon.jsonseguinte:

{
    "experimental": true
}

e reiniciando o serviço docker systemctl, mas como fazer isso no CircleCI? Parece impossível, pois a saída de construção indica que é feita uma conexão com uma janela de encaixe remota que reside nos sistemas CircleCI.

030
fonte

Respostas:

5

Você está enfrentando as limitações dos serviços gerenciados. Muitos serviços gerenciados são ótimos para começar a experimentar idéias e podem mostrar um grande valor para o usuário casual. Mas eles trocam facilidade de uso por flexibilidade e funcionalidade; portanto, assim que começarmos a ter sérias necessidades e estivermos prontos para gastar uma quantidade significativa de esforço desenvolvendo essas idéias, o primeiro passo que devemos fazer é optar por uma solução flexível. solução totalmente funcional. Na minha opinião, você está na linha onde precisa procurar outra coisa - e perceberá que precisa aprender uma ferramenta diferente, porque esse não é um software livre e você não pode executá-lo.

Aqui estamos falando sobre o Circle CI, mas as seguintes limitações são comuns a muitos serviços gerenciados:

  • Os serviços gerenciados impõem uma forte contraposição nas versões de software que eles nos permitem usar. Essas restrições podem corresponder ao que precisamos hoje, mas não precisam mais tarde. Eles já podem estar fora de sincronia hoje. De qualquer forma, isso geralmente é um impedimento de exibição, porque ser incapaz de usar as mesmas versões de software no ambiente de desenvolvimento e no ambiente gerenciado é uma fonte inútil de bugs e dificuldades de todo tipo.

  • Os serviços gerenciados fornecem acesso restrito às suas funcionalidades. Este é o problema que você está enfrentando aqui: deseja executar a janela de encaixe, mas não tem acesso ao daemon, apenas a um subconjunto de suas funções. Essas limitações às vezes não são bem documentadas nem trazidas à luz pelo material publicitário. Isso significa apenas que o trabalho gasto na compreensão e integração desses recursos é inútil até deixarmos o serviço gerenciado para outra solução melhor.

  • Os serviços gerenciados fornecem acesso restrito aos dados que armazenamos lá. Portanto, para dar o exemplo de serviços gerenciados para registro e monitoramento, o acesso aos dados é lento, inconveniente e expansivo. Se executarmos nossa infraestrutura, ficaremos livres para executar qualquer análise personalizada sofisticada em nossos artefatos de monitoramento, porque os dados são mais fáceis de acessar.

Observe que este não é um caso contra serviços gerenciados. Uma mão deles é capaz de combinar facilidade de uso com flexibilidade e funcionalidade. Mas muitos desses serviços trocam facilidade de uso por flexibilidade e funcionalidade: podemos usá-los como um expediente para criar rapidamente uma funcionalidade simples, mas eles nos impedirão de ir além desse ponto. Precisamos estar cientes dessa troca e considerar.

Michael Le Barbier Grünewald
fonte
8

O CircleCI agora permite que você use um executor de máquina que provisiona uma VM separada para você, com o Ubuntu 14.04 e o Docker versão 17.06.0-ce instalados. Isso permite ativar os recursos experimentais para o daemon do Docker.

Você precisa usar a machinechave em vez da dockerchave para executar seu trabalho em uma máquina virtual separada em vez de apenas em um contêiner do Docker.

Você pode escolher apenas 2 imagens para a máquina:

  • circleci/classic:latest: Ubuntu 14.04 com Docker 17.03.0-ce ou
  • circleci/classic:edge: Ubuntu 14.04 com Docker 17.06.0-ce - aquele com recursos experimentais.

Você também precisará instalar dependências na máquina, pois é bastante simples. Por exemplo, se você precisar de PHP para seus testes, precisará executar sudo apt-get install -y php5.

Aqui está um exemplo .circleci / config.yml que cria uma imagem do Docker usando o recurso experimental 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
fonte
1
Essa deve ser a resposta aceita. Funciona muito bem no Circle CI. Acabei de obter a minha imagem fina de 1 GB para 180 MB.
pista329