我一直在使用fabric8 maven插件来构建docker镜像。我的用户是 docker 组的一部分,一切正常。
我最近获得了一台“新的更加锁定”的工作计算机,并且必须运行“sudo”来构建 docker 映像。
运行fabric8 maven构建,但是失败并出现错误:
Execution default of goal io.fabric8:docker-maven-plugin:0.43.4:build failed: No <dockerHost> given, no DOCKER_HOST environment variable, no read/writable '/var/run/docker.sock' or '//./pipe/docker_engine' and no external provider like Docker machine configured
我的 docker 引擎正在本地主机上运行,并且 /var/run/docker.sock 可用,但不可“写”:
ls -al /var/run/docker.sock
srwxr-xr-x 1 root root 0 Oct 9 22:53 /var/run/docker.sock
我可以“sudo docker build ...”(我有一些项目使用 mvn exec 而不是 Fabric8,它们仍然可以工作)。
我不知道是否可以将 Fabric8 配置为以某种方式使用“sudo”来完成其工作。
我们实际上创建了一些 Docker 化的“构建映像”,用于为所有开发人员执行项目构建。 (每个人都使用相同的环境、依赖项等)
我们启动构建容器,安装在源和docker套接字中,用户可以从内部执行构建。 我们将用户 ID/GID 传递到容器,并使用这些 ID 在容器中设置用户,以便构建输出具有适当的所有权。。这几年来效果一直很好。
这些新的“锁定”系统以我不理解的方式处理 docker 套接字。
Got permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock: Get "http://%2Fvar%2Frun%2Fdocker.sock/v1.24/containers/json": dial unix /var/run/docker.sock: connect: permission denied
经过一天的堆栈溢出搜索,我发现这个问题对我的具体情况有帮助。
我们的构建容器的入口点从 docker 命令行获取传入的 UID/GID,并以 root 身份设置该用户,然后切换到该用户来执行构建命令。 (简洁的小工具,名为 gosu)
我发现,在容器中设置用户后,可以 chown myuser:mygroup /var/run/docker.sock。完成后,“myuser”现在可以“本地”执行 docker 命令。
我有点震惊,因为在我的主机上, /var/run/docker.sock 是 /Users//.docker/run/docker.sock 的软链接。我安装/var/run/docker.sock。某种 mac/docker wizadry 正在幕后进行。