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