Cómo ejecutar características experimentales de Docker en CircleCI

12

Cuando se inicia una compilación en CircleCI, una de las primeras cosas que se hace es:

Configurar un motor 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 cuando docker build --squash -t imagename .se ejecuta en CircleCI resulta en:

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

Discusión

Funciona para usar características experimentales localmente después de cambiar lo /etc/docker/daemon.jsonsiguiente:

{
    "experimental": true
}

y reiniciando el servicio docker systemctl, pero ¿cómo hacerlo en CircleCI? Parece imposible ya que la salida de compilación indica que se realiza una conexión a un acoplador remoto que reside en los sistemas CircleCI.

030
fuente

Respuestas:

5

Se encuentra con las limitaciones de los servicios administrados. Muchos servicios administrados son excelentes para comenzar a experimentar con ideas y pueden mostrar un gran valor para el usuario casual. Pero intercambian la facilidad de uso por flexibilidad y funcionalidad, por lo tanto, tan pronto como comencemos a tener serias necesidades y estemos listos para gastar una cantidad significativa de esfuerzo en desarrollar estas ideas, el primer movimiento que debemos hacer es optar por una solución flexible. Solución totalmente funcional. A mi juicio, está llegando a la línea en la que necesita buscar otra cosa, y notará que necesita aprender una herramienta diferente, porque ese no es software libre y no puede ejecutarlo usted mismo.

Aquí estamos hablando de Circle CI, pero las siguientes limitaciones son comunes a muchos servicios administrados:

  • Los servicios administrados ponen una fuerte impronta en las versiones de software que nos permiten usar. Estas restricciones pueden coincidir con lo que necesitamos hoy, pero no es necesario en un momento posterior. Puede que ya no estén sincronizados hoy. En cualquier caso, esto es a menudo un obstáculo, porque no poder usar las mismas versiones de software en el entorno de desarrollo y en el entorno administrado es una fuente inútil de errores y dificultades de todo tipo.

  • Los servicios gestionados proporcionan acceso restringido a sus funcionalidades. Este es el problema que enfrenta aquí: desea ejecutar Docker, pero no tiene acceso al demonio, solo a un subconjunto de sus funciones. Estas limitaciones a veces no están bien documentadas ni se ponen de manifiesto a través del material publicitario. Esto solo significa que el trabajo dedicado a comprender e integrar estas características no tiene ningún valor hasta que dejemos el servicio administrado por otra solución mejor.

  • Los servicios gestionados proporcionan acceso restringido a los datos que almacenamos allí. Entonces, para tomar el ejemplo de los servicios administrados para el registro y la supervisión, el acceso a los datos es lento, inconveniente y expansivo. Si ejecutamos nuestra infraestructura, somos libres de ejecutar cualquier análisis personalizado de nuestros artefactos de monitoreo, porque es más fácil llegar a los datos.

Tenga en cuenta que este no es un caso contra los servicios administrados. Una parte de ellos puede combinar la facilidad de uso junto con la flexibilidad y la funcionalidad. Pero muchos de estos servicios intercambian la facilidad de uso por flexibilidad y funcionalidad: podemos usarlos como un recurso para crear rápidamente una funcionalidad simple, pero nos impedirán caminar más allá de ese punto. Debemos ser conscientes de esta compensación y considerarla.

Michael Le Barbier Grünewald
fuente
8

CircleCI ahora le permite usar un ejecutor de máquina que aprovisiona una VM separada para usted, con Ubuntu 14.04 y Docker versión 17.06.0-ce instalada. Esto le permite activar funciones experimentales para el demonio Docker.

Debe usar la machineclave en lugar de la dockerclave, para ejecutar su trabajo en una máquina virtual separada en lugar de solo un contenedor Docker.

Solo puede elegir 2 imágenes para la máquina:

  • 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, el que tiene características experimentales.

También necesitará instalar dependencias en la máquina usted mismo, ya que es bastante simple. Por ejemplo, si necesita PHP para sus pruebas, deberá ejecutarlo sudo apt-get install -y php5.

Aquí hay un ejemplo de .circleci / config.yml que construye una imagen Docker usando la función 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
fuente
1
Esta debería ser la respuesta aceptada. Funciona muy bien en Circle CI. Acabo de obtener mi imagen delgada de 1 GB hasta 180 MB.
pista329