我有一个非常简单的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构建)构建和远程构建都将起作用.