如何在CircleCI上运行实验性Docker功能


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系统上驻留的远程docker的连接,因此这似乎是不可能的。

Answers:


5

您遇到了托管服务的限制。许多托管服务非常适合开始尝试构想,并且可以为临时用户带来巨大价值。但是他们交易易用性灵活性和功能性的,因此只要我们开始有严重的需求,并准备花费的精力放在这些想法建立一个显著量,我们应该做的第一个动作是选择灵活的一功能齐全的解决方案。根据我的判断,您正在寻找其他东西的路线上,您会发现您需要学习其他工具,因为它不是免费软件,您无法自己运行它。

在这里,我们谈论的是Circle CI,但是以下限制对于许多托管服务来说是常见的:

  • 托管服务对其允许我们使用的软件版本构成了严格的限制。这些限制可能符合我们今天的需求,但以后不再需要。他们今天可能已经不同步了。在任何情况下,这通常都是放映机,因为在开发环境和托管环境中无法使用相同的软件版本是各种错误和困难的无用来源。

  • 托管服务提供对其功能的受限访问。这是您在此处面临的问题:您想运行docker,但无权访问该守护程序,而只能访问其一部分功能。这些限制有时没有得到很好的证明,也没有被广告材料充分体现出来。这仅意味着在我们将托管服务留给另一个更好的解决方案之前,花在理解和集成这些功能上的工作是毫无价值的。

  • 托管服务提供了对我们存储在那里的数据的受限访问。因此,以用于日志记录和监视的托管服务为例,数据访问速度慢,不便且扩展。如果我们运行基础架构,则可以自由地对监视工件进行任何精美的自定义分析,因为数据更易于获取。

请注意,这不是针对托管服务的情况。他们中的一员能够将易用性与灵活性和功能性结合在一起。但是,这些服务中的许多服务都出于易用性而具有灵活性和功能性:我们可以将它们用作快速构建简单功能的权宜之计,但是它们将阻止我们超越这一点。我们需要意识到这种权衡并考虑。


8

现在,CircleCI允许您使用机器执行程序为您预配一个单独的VM,并安装了Ubuntu 14.04和Docker 17.06.0-ce版本。这使您可以打开Docker守护程序的实验性功能。

您需要使用machine密钥而不是docker密钥来在单独的虚拟机中而不是仅在Docker容器中运行作业。

您只能为机器选择2张图像:

  • circleci/classic:latest:具有Docker 17.03.0-ce的Ubuntu 14.04,或
  • circleci/classic:edge:带有Docker 17.06.0-ce的Ubuntu 14.04-具有实验性功能的一个。

您还需要自己在计算机上安装依赖项,因为它非常裸露。例如,如果您需要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中效果很好。我的1GB超薄映像已降至180MB。
pista329 '18 -10-25
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.