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

49次阅读
没有评论

问题描述

在使用CircleCI时,希望能够运行Docker实验性功能,但在使用docker build --squash -t imagename .时出现错误提示:“squash is only supported with experimental mode”。
用户已经在本地环境通过更改/etc/docker/daemon.json文件中的"experimental": true并重启docker systemctl服务来成功使用实验性功能。然而,在CircleCI上的远程Docker引擎似乎无法启用这些实验性功能。用户希望了解如何在CircleCI上运行带有实验性功能的Docker构建。

解决方案

请注意以下操作可能涉及版本差异,确保备份数据,并且仅在确保理解操作风险的情况下进行。

方案1:使用CircleCI的机器执行器(machine executor)

最近,CircleCI允许使用机器执行器(machine executor),它会为您提供一个单独的虚拟机,其中安装了Ubuntu 14.04和Docker版本17.06.0-ce,这使得您可以打开Docker守护程序的实验性功能。

在CircleCI配置中,您需要使用machine关键字,而不是docker关键字,以便在单独的虚拟机中运行作业,而不仅仅是一个Docker容器。

您可以在机器执行器上选择以下两个镜像之一:
1. circleci/classic:latest:使用Ubuntu 14.04和Docker 17.03.0-ce。
2. circleci/classic:edge:使用Ubuntu 14.04和Docker 17.06.0-ce(带有实验性功能)。

请注意,在机器执行器上,您需要自己安装所需的依赖项,因为它相对较基本。例如,如果您的测试需要PHP,您需要运行sudo apt-get install -y php5

以下是一个示例的.circleci/config.yml文件,其中构建一个使用实验性功能docker build --squash的Docker镜像:

version: 2
jobs:
  build:
    # 在单独的虚拟机中运行,而不是在Docker容器中。
    machine:
      enabled: true
      # 使用Ubuntu 14.04和Docker 17.06.0-ce(带有实验性功能)。
      image: circleci/classic:edge
    steps:
      - checkout
      - run:
          command: |
            # 重启带有实验性功能的Docker。
            sudo sh -c 'echo '\''DOCKER_OPTS="--experimental=true"'\'' >> /etc/default/docker'
            sudo service docker restart
            # 安装测试等所需的依赖项。
            sudo apt-get update
            sudo apt-get install -y php5
            # 使用实验性功能 --squash 构建镜像。
            docker build --squash -t myuser/myimage .
            # 登录并推送Docker镜像到注册表。
            docker login -u $DOCKER_USER -p $DOCKER_PASS
            docker push myuser/myimage

方案2:切换到更灵活、功能更丰富的解决方案

您可能已经到达了使用托管服务的限制。许多托管服务适合开始尝试新的想法,并且对于临时用户来说可能非常方便。但是,它们通常以灵活性和功能性为代价,因此一旦我们开始有严重的需求,并且愿意花费大量的精力来构建这些想法,我们应该切换到更灵活和功能更丰富的解决方案。

在您的情况下,您似乎已经达到了一个临界点,需要考虑寻找其他解决方案。这意味着您需要学习不同的工具,因为这不是自由软件,并且您无法自行运行它。

以下是一些常见的受管理服务的共同限制,这些限制可能适用于许多受管理的服务:
1. 受管理的服务对于我们可以使用的软件版本进行了严格的限制。这些限制可能在今天与我们的需求匹配,但在以后的某个时间可能不匹配。它们甚至可能已经在今天不同步。无论如何,这通常是一个障碍,因为无法在开发环境和受管理环境中使用相同的软件版本是一种无用的错误来源。
2. 受管理的服务提供对其功能的受限访问。这是您在这里遇到的问题:您想要运行Docker,但您无法访问守护程序,只能访问其部分功能。这些限制有时可能没有得到很好的文档化或在广告材料中充分展示。这意味着在理解和集成这些功能方面投入的工作直到我们离开受管理服务寻找更好的解决方案之前都是无价值的。
3. 受管理的服务对我们在其上存储的数据提供了受限访问。因此,以日志和监控为例,数据访问是缓慢、不便和昂贵的。如果我们自己运行基础架构,我们可以更轻松地访问任何自定义分析,因为数据更容易获取。

需要注意的是,这不是反对受管理服务。其中一些服务能够在易用性和灵活性方面做到并存。但是,许多这样的服务以易用性为代价,我们可以将其视为一个快速构建简单功能的手段,但它们将

正文完