Docker:在尝试使用本地CircleCI构建连接到Docker Daemon时,权限被拒绝

时间:2017-08-21 12:04:14

标签: docker continuous-integration sudo circleci

我有一个非常简单的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图像,测试节点是否正在运行,执行yarn installdocker build

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

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

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本身工作。 使用sudo适用于CircleCI,但不适用于本地。

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

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

2 个答案:

答案 0 :(得分:3)

我为自己创造了一种解决方法。

在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。只有在本地计算机上运行circleci build时才会出现这种情况。 如果为true ,它会在主目录中创建一个名为sudo且内容为sudo的文件。 如果为false ,它会在主目录中创建一个名为sudo的文件,其中包含NO内容。

第二个代码段会打开~/sudo文件,然后使用您之后提供的参数执行该文件。如果~/sudo文件包含" sudo",则此示例中的命令将变为sudo docker build .,如果它不包含任何内容,它将成为docker build . {1}},前面有空格,但会被忽略。

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

答案 1 :(得分:3)

要迭代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

的文档