我有一个非常简单的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.
答案 0 :(得分:3)
我为自己创造了一种解决方法。
在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
的文件,其中包含NO内容。
第二个代码段会打开~/sudo
文件,然后使用您之后提供的参数执行该文件。如果~/sudo
文件包含" sudo
",则此示例中的命令将变为sudo docker build .
,如果它不包含任何内容,它将成为docker build .
{1}},前面有空格,但会被忽略。
这样,本地(circleci build
)构建和远程构建都可以工作。
答案 1 :(得分:3)
要迭代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
中看到这一点
的文档