Docker:尝试使用本地 CircleCI 构建连接到 Docker 守护程序时权限被拒绝

Docker: permission denied while trying to connect to Docker Daemon with local CircleCI build

我有一个很简单的config.yml:

version: 2

jobs:
  build:
    working_directory: ~/app
    docker:
      - image: circleci/node:8.4.0
    steps:
      - checkout
      - run: node -e "console.log('Hello from NodeJS ' + process.version + '\!')"
      - run: yarn
      - setup_remote_docker
      - run: docker build .

它所做的一切:启动一个 node 映像,测试节点是否 运行ning,执行一个 yarn install 和一个 docker build.

我的 dockerfile 没什么特别的;它有一个 COPY 和 ENTRYPOINT。

当我 运行 circleci build 在我的 MacBook Air 上使用 Docker Native 时,我收到以下错误:

Got permission denied while trying to connect to the Docker daemon socket at unix://[...]

如果我将 docker build . 命令更改为:sudo docker build .,一切都按计划在本地使用 circleci build
但是,将此更改推送到 CircleCI 将导致错误:Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?

因此,总结一下:使用 sudo 在本地有效,但在 CircleCI 本身上无效。 Not 使用 sudo 适用于 CircleCI,但不适用于本地。

这是 CircleCI 工作人员必须解决的问题,还是我可以做些什么?

For reference, I have posted this question on the CircleCI forums as well.

我已经为自己创建了一个解决方法。

在 config.yml 的第一步,我 运行 这个命令:

if [[ $CIRCLE_SHELL_ENV == *"localbuild"* ]]; then
  echo "This is a local build. Enabling sudo for docker"
  echo sudo > ~/sudo
else
  echo "This is not a local build. Disabling sudo for docker"
  touch ~/sudo
fi

之后,您可以这样做:

eval `cat ~/sudo` docker build .

解释:

第一个片段 检查 CircleCI 提供的环境变量 CIRCLE_SHELL_ENV 是否包含 localbuild。只有在您的本地计算机上 运行ning circleci build 时才会出现这种情况。 如果为真,它会在主目录中创建一个名为 sudo 的文件,其内容为 sudo如果为 false,它会在主目录中创建一个名为 sudo 的文件,其中没有任何内容。

第二个片段 打开 ~/sudo 文件,并使用您之后提供的参数执行它。如果 ~/sudo 文件包含“sudo”,则此示例中的命令将变为 sudo docker build .,如果不包含任何内容,它将变为 docker build .,并带有 space 在它之前,但会被忽略。

这样,本地 (circleci build) 构建和远程构建都可以工作。

重复 Jeff Huijsmans 的回答,

另一种版本是对 docker 使用 Bash 变量:

- run:
    name: Set up docker
    command: |
        if [[ $CIRCLE_SHELL_ENV == *"localbuild"* ]]; then
            echo "export docker='sudo docker'" >> $BASH_ENV
        else
            echo "export docker='docker'" >> $BASH_ENV
        fi

然后你可以在你的配置中使用它

- run:
    name: Verify docker
    command: $docker --version

您可以在 my test for my Dotfiles repository

中看到实际效果

关于 environment variables in CircleCi

的文档

您也可以通过 运行 docker 图像作为 root 来解决您的问题。在image参数下指定user: root

...
jobs:
  build:
    working_directory: ~/app
    docker:
      - image: circleci/node:8.4.0
        user: root
    steps:
      - checkout
      ...
...