【问题标题】:Docker: permission denied while trying to connect to Docker Daemon with local CircleCI buildDocker:尝试使用本地 CircleCI 构建连接到 Docker 守护程序时权限被拒绝
【发布时间】:2018-01-29 12:02:59
【问题描述】:

我有一个很简单的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.

【问题讨论】:

    标签: docker continuous-integration sudo circleci


    【解决方案1】:

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

    在 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 .
    

    解释:

    第一个 sn-p 检查 CircleCI 提供的环境变量 CIRCLE_SHELL_ENV 是否包含 localbuild。仅当在本地计算机上运行 circleci build 时才适用。 如果为真,它会在主目录中创建一个名为sudo 的文件,其内容为sudo如果为 false,它会创建一个名为 sudo 的文件,主目录中没有内容。

    第二个 sn-p 打开 ~/sudo 文件,并使用您之后提供的参数执行它。如果~/sudo文件中包含“sudo”,则本例中的命令将变为sudo docker build .,如果不包含任何内容,则变为docker build .,前面有一个空格,但会被忽略.

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

    【讨论】:

    • 这是一个很好的解决方法,但可惜他们的 CLI 不能处理这种情况......
    • 我相信您的touch ~/sudo 不会清除文件。它应该是: > ~/sudo 或类似的,以实际清除文件。本质上它总是使用sudo,因为文件永远不会清除。
    【解决方案2】:

    重复 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的文档

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-06-28
        • 1970-01-01
        • 2018-05-30
        • 1970-01-01
        • 1970-01-01
        • 2020-12-28
        • 1970-01-01
        • 2017-03-27
        相关资源
        最近更新 更多