Docker:尝试使用本地 CircleCI 构建连接到 Docker 守护程序时权限被拒绝
Posted
技术标签:
【中文标题】Docker:尝试使用本地 CircleCI 构建连接到 Docker 守护程序时权限被拒绝【英文标题】:Docker: permission denied while trying to connect to Docker Daemon with local CircleCI build 【发布时间】:2018-01-29 12:02:59 【问题描述】:我有一个很简单的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。
当我使用 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?
所以,总结一下:使用 sudo
在本地有效,但不适用于 CircleCI 本身。 不使用 sudo
在 CircleCI 上工作,但在本地不工作。
这是 CircleCI 工作人员必须解决的问题,还是我可以做些什么?
For reference, I have posted this question on the CircleCI forums as well.
【问题讨论】:
【参考方案1】:我已经为自己创建了一个解决方法。
在 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 .
解释:
第一个 sn-p 检查 CircleCI 提供的环境变量 CIRCLE_SHELL_ENV
是否包含 localbuild
。仅当在本地计算机上运行 circleci build
时才适用。
如果为真,它会在主目录中创建一个名为sudo
的文件,其内容为sudo
。
如果为 false,它会创建一个名为 sudo
的文件,主目录中没有内容。
第二个 sn-p 打开 ~/sudo
文件,并使用您之后提供的参数执行它。如果~/sudo
文件中包含“sudo
”,则本例中的命令将变为sudo docker build .
,如果不包含任何内容,则变为docker build .
,前面有一个空格,但会被忽略.
这样,本地 (circleci build
) 构建和远程构建都可以工作。
【讨论】:
这是一个很好的解决方法,但可惜他们的 CLI 不能处理这种情况...... 我相信您的touch ~/sudo
不会清除文件。它应该是: > ~/sudo
或类似的,以实际清除文件。本质上它总是使用sudo
,因为文件永远不会清除。【参考方案2】:
重复 Jeff Huijsmans 的答案,
另一种版本是为docker
使用 Bash 变量:
- run:
name: Set up docker
command: |
if [[ $CIRCLE_SHELL_ENV == *"localbuild"* ]]; then
echo "export docker='sudo docker'" >> $BASH_ENV
else
echo "export docker='docker'" >> $BASH_ENV
fi
然后你可以在你的配置中使用它
- run:
name: Verify docker
command: $docker --version
您可以在my test for my Dotfiles repository 中看到这一点
关于environment variables in CircleCi的文档
【讨论】:
【参考方案3】:您也可以通过以 root 身份运行 docker 映像来解决您的问题。在image
参数下指定user: root
:
...
jobs:
build:
working_directory: ~/app
docker:
- image: circleci/node:8.4.0
user: root
steps:
- checkout
...
...
【讨论】:
以上是关于Docker:尝试使用本地 CircleCI 构建连接到 Docker 守护程序时权限被拒绝的主要内容,如果未能解决你的问题,请参考以下文章
xcodebuild 归档失败,CircleCI 上的退出状态为 65
在 CircleCI 工作流或作业之后触发 Github Action