Docker:尝试连接到本地CircleCI构build的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 . 

它所做的一切:启动node映像,testing节点是否在运行,执行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? Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?

所以,总结一下:在本地使用sudo作品,而不是CircleCI本身。 在CircleCI上使用sudo ,但不在本地使用。

这是CircleCI员工需要解决的问题,还是我可以做的事?

作为参考,我也在CircleCI论坛上发布了这个问题。

我为自己创build了一个解决方法。

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

 if [[ $CIRCLE_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提供的环境variablesCIRCLE_ENV包含localbuild 。 只有在本地计算机上运行circleci build时才是如此。 如果为true ,则会在主目录中创build一个名为sudo的内容为sudo的文件。 如果为false ,则会在主目录中创build一个名为sudo的文件,其中包含NO内容。

第二个片段打开~/sudo文件,然后用你之后给出的参数执行它。 如果~/sudo文件包含“ sudo ”,则此示例中的命令将成为sudo docker build . ,如果它不包含任何东西,它将成为docker build . ,之前有一个空间,但是会被忽略。

这样一来,本地( circleci build )构build和远程构build都将起作用。