Как запустить экспериментальные функции Docker на CircleCI

12

Когда на CircleCI начинается сборка, первое, что делается, это:

Настройка удаленного движка Docker

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

Впоследствии, когда docker build --squash -t imagename .запускается на CircleCI, это приводит к:

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

обсуждение

Это работает, чтобы использовать экспериментальные функции локально после изменения /etc/docker/daemon.jsonследующим образом:

{
    "experimental": true
}

и перезапустить службу docker systemctl, но как это сделать на CircleCI? Это кажется невозможным, поскольку выходные данные сборки указывают, что установлено соединение с удаленным докером, который находится в системах CircleCI.

030
источник

Ответы:

5

Вы сталкиваетесь с ограничениями управляемых сервисов. Многие управляемые сервисы хороши для того, чтобы начать экспериментировать с идеями, и могут показать большую ценность для обычного пользователя. Но они обмениваются простотой использования на гибкость и функциональность, поэтому, как только у нас появятся серьезные потребности и мы готовы потратить значительное количество усилий на развитие этих идей, первое, что мы должны сделать, - это выбрать гибкий полностью функциональное решение. По моему мнению, вы попали в черту, где вам нужно искать что-то еще - и вы заметите, что вам нужно изучить другой инструмент, потому что это не бесплатное программное обеспечение, и вы не можете запустить его самостоятельно.

Здесь мы говорим о Circle CI, но следующие ограничения являются общими для многих управляемых сервисов:

  • Управляемые сервисы накладывают жесткие ограничения на версии программного обеспечения, которые они нам позволяют использовать. Эти ограничения могут соответствовать тому, что нам нужно сегодня, но не нужно позже. Они могут быть уже не синхронизированы сегодня. В любом случае это часто является пробкой, потому что неспособность использовать одинаковые версии программного обеспечения в среде разработки и в управляемой среде является бесполезным источником ошибок и всевозможных трудностей.

  • Управляемые сервисы предоставляют ограниченный доступ к своим функциям. Вот проблема, с которой вы здесь сталкиваетесь: вы хотите запустить docker, но у вас нет доступа к демону, только к подмножеству его функций. Эти ограничения иногда плохо документированы и не освещаются рекламными материалами. Это просто означает, что работа, потраченная на понимание и интеграцию этих функций, бесполезна, пока мы не оставим управляемый сервис для другого лучшего решения.

  • Управляемые сервисы предоставляют ограниченный доступ к данным, которые мы храним там. Итак, на примере управляемых сервисов для регистрации и мониторинга, доступ к данным является медленным, неудобным и дорогим. Если мы запустим нашу инфраструктуру, мы сможем выполнить любой нестандартный анализ наших артефактов мониторинга, потому что данные легче получить.

Обратите внимание, что это не относится к управляемым сервисам. Их рука способна сочетать простоту использования с гибкостью и функциональностью. Но многие из этих сервисов обмениваются простотой использования на гибкость и функциональность: мы можем использовать их в качестве средства быстрого создания простой функциональности, но они не позволят нам выйти за пределы этого уровня. Нам нужно знать об этом компромиссе и рассмотреть.

Михаэль Ле Барбье Грюневальд
источник
8

Теперь CircleCI позволяет вам использовать машинный исполнитель, который предоставляет отдельную виртуальную машину для вас с установленными Ubuntu 14.04 и Docker версии 17.06.0-ce. Это позволяет вам включать экспериментальные функции для демона Docker.

Вам нужно использовать machineключ вместо dockerключа, чтобы запустить свою работу на отдельной виртуальной машине, а не просто в контейнере Docker.

Вы можете выбрать только 2 изображения для машины:

  • circleci/classic:latest: Ubuntu 14.04 с Docker 17.03.0-ce или
  • circleci/classic:edge: Ubuntu 14.04 с Docker 17.06.0-ce - с экспериментальными функциями.

Вам также необходимо самостоятельно установить зависимости на компьютере, так как он совершенно пустой. Например, если вам нужен PHP для ваших тестов, вам нужно будет запустить sudo apt-get install -y php5.

Вот пример .circleci / config.yml, который создает образ Docker с использованием экспериментальной функции 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
Это должен быть принятый ответ. Очень хорошо работает в Circle CI. Только что получил мое 1 ГБ тонкое изображение до 180 МБ.
pista329