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

标签 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 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 本身上运行。 使用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。仅当在本地计算机上运行 circleci build 时才会出现这种情况。 如果为 true,它会在主目录中创建一个名为 sudo 且内容为 sudo 的文件。 如果为 false,它会创建一个名为 sudo 的文件,主目录中没有任何内容。

第二个代码段打开~/sudo 文件,并使用您随后给出的参数执行它。如果 ~/sudo 文件包含“sudo”,则本例中的命令将变为 sudo docker build .,如果不包含任何东西,它都会变成 docker build .,前面有一个空格,但这将被忽略。

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

关于Docker:尝试使用本地 CircleCI 构建连接到 Docker Daemon 时权限被拒绝,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45796661/

相关文章:

shell - 如何检查一个进程是否在 docker 容器内运行?

github - 将 Github 链接挂载为 docker 卷

docker - io.k8s.api.core.v1.PodSecurityContext中的未知字段 "capabilities"(在容器/k8s容器中运行tshark)

build - 专用 "Build Server"的用途是什么?

python - Mac OS X Python GUI 管理员提示

ubuntu - 在 Ubuntu 14.04 上安装 Docker 时出现 Modprobe 错误

ios - PackageApplication 今天停止使用 OS X 10.10 (Yosemite)

continuous-integration - CruiseControl.Net:如何清除过时的 build 历史?

linux - Ubuntu shell 脚本 - root 权限

ruby - 使用 ruby​​ gem net-ssh-multi 同时在多个服务器上执行 sudo 命令