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

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

它所做的全部工作:引导节点映像,测试节点是否正在运行,执行yarn安装和docker build.

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

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

尝试连接到unix:// […]上的Docker守护进程套接字时,获得的权限被拒绝

如果我更改docker build.命令执行以下命令:sudo docker build.,一切都按计划在本地进行,并使用circleci构建.
但是,将此更改推送到CircleCI将导致错误:无法通过unix:///var/run/docker.sock连接到Docker守护程序.泊坞窗守护程序正在运行吗?

因此,总结一下:在本地使用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构建时,这才是正确的.
如果为true,它将在主目录中创建一个名为sudo的文件,其内容为sudo.
如果为false,它将创建一个名为sudo的文件,该文件的主目录中没有内容.

第二个片段打开〜/ sudo文件,并使用您随后提供的参数执行该文件.如果〜/ sudo文件包含“ sudo”,则此示例中的命令将成为sudo docker build.,如果不包含任何内容,它将成为docker build.,并在其前面有一个空格,但这将被忽略.

这样,本地(circleci构建)构建和远程构建都将起作用.

相关文章

最近一直在开发Apworks框架的案例代码,同时也在一起修复Apw...
最近每天都在空闲时间努力编写Apworks框架的案例代码WeText。...
在《Kubernetes中分布式存储Rook-Ceph部署快速演练》文章中,...
最近在项目中有涉及到Kubernetes的分布式存储部分的内容,也...
CentOS下Docker与.netcore(一) 之 安装 CentOS下Docker与.ne...
CentOS下Docker与.netcore(一) 之 安装 CentOS下Docker与.ne...