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 install
和docker 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都将起作用。