在CircleCI上开始构建时,首先要做的事情之一是:


设置远程Docker引擎
>
随后,当在CircleCI上运行docker build --squash -t imagename .时,会导致:

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


讨论

如下更改/etc/docker/daemon.json

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


,然后重新启动docker systemctl服务,但是如何在CircleCI上做到这一点?似乎不可能,因为构建输出指示已建立到CircleCI系统上的远程docker的连接。

#1 楼

您遇到了托管服务的限制。许多托管服务非常适合开始尝试创意,并且可以为临时用户带来巨大价值。但是它们以易用性换取了灵活性和功能性,因此,一旦我们开始有迫切的需求并准备花费大量的精力来建立这些构想,我们应该做的第一步就是选择一种灵活的功能齐全的解决方案。根据我的判断,您遇到了需要寻找其他东西的问题-您会发现您需要学习其他工具,因为这不是免费软件,您无法自己运行它。

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


托管服务对它们允许我们使用的软件版本提出了严格的限制。这些限制可能符合我们今天的需求,但以后不再需要。他们今天可能已经不同步了。在任何情况下,这通常都是一个阻碍因素,因为在开发环境和托管环境中无法使用相同的软件版本是无用的bug和各种困难的源。
托管服务提供了对其功能的受限访问。这是您在此处面临的问题:您想运行docker,但无权访问该守护程序,而只能访问其一部分功能。这些限制有时没有得到很好的证明,也没有被广告材料充分体现。这仅意味着,在我们将托管服务留给另一个更好的解决方案之前,花在理解和集成这些功能上的工作是毫无价值的。
托管服务提供了对我们存储在那里的数据的受限访问。因此,以用于日志记录和监视的托管服务为例,数据访问速度慢,不便且扩展。如果我们运行基础架构,则可以自由地对监视工件进行任何精美的自定义分析,因为数据更易于访问。他们中的一员能够将易用性与灵活性和功能性结合在一起。但是,这些服务中的许多服务都以易用性来实现灵活性和功能性:我们可以将它们用作快速构建简单功能的权宜之计,但是它们将阻止我们超越这一点。我们需要意识到这种权衡并考虑。

#2 楼

现在,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 build --squash构建Docker映像:


.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



评论


这应该是公认的答案。在Circle CI中效果很好。我的1GB超薄映像降至180MB。

– pista329
18-10-25在11:54