当前位置: 首页 > 知识库问答 >
问题:

Docker权限中的Docker错误

艾意蕴
2023-03-14

我在CI的docker设置中有一个docker。本质上,机器上有一个jenkins CI服务器,它使用相同的机器docker套接字为CI创建节点。

这是伟大的工作,直到我最近更新了docker。我已经发现了这个问题,但是我似乎找不出正确的方法来让它工作。

host $ docker exec -it myjenkins bash
jenkins@container $ docker ps
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.26/containers/json: dial unix /var/run/docker.sock: connect: permission denied

host $ docker exec -it -u root -it myjenkins bash
root@container $ docker ps 
... docker ps from host container yay! ...

这就是我的猜测。我可以从容器中访问主机docker套接字,但我似乎无法向jenkins用户授予权限。

我已经添加了docker组,还将jenkins用户添加到了docker组。但是我仍然得到同样的错误。我已经重新开始了很多次,所以我不知道下一步该做什么。

是否有方法强制用户对特定套接字拥有权限?

共有3个答案

竺勇
2023-03-14

就我个人而言,我不得不这么做:

sudo gpasswd -a $USER docker 

结果成功了

谢和颂
2023-03-14

如其他答案所述,您必须确保容器内的用户“jenkins”有权通过/var/run/Docker向主机上的Docker引擎发出Docker命令。sock安装。

一种简单的方法是:

$ docker run --rm -d --group-add $(stat -c '%g' /var/run/docker.sock) -v /var/run/docker.sock:/var/run/docker.sock -P myjenkins

但要小心:

如果您的Jenkins作业需要执行Docker build/run命令(例如,构建容器),这是不够的。原因是容器化的Jenkins会要求主机中的Docker部署Docker代理容器,而Docker agent容器在连接到主机上的Docker-daemon时会面临类似的“权限错误”。

有一篇博文描述了https://blog.nestybox.com/2019/09/29/jenkins.html.的问题和解决方案

长孙泉
2023-03-14

您需要将主机上 docker 组的 gid 映射到容器内 jenkins 所属的组的 gid。以下是我的 Docker 文件中的一个示例,其中包含我如何构建詹金斯从属映像:

ARG DOCKER_GID=993

RUN groupadd -g ${DOCKER_GID} docker \
  && curl -sSL https://get.docker.com/ | sh \
  && apt-get -q autoremove \
  && apt-get -q clean -y \
  && rm -rf /var/lib/apt/lists/* /var/cache/apt/*.bin 

RUN useradd -m -d /home/jenkins -s /bin/sh jenkins \
  && usermod -aG docker jenkins

在本例中,993恰好是主机上docker的gid,您可以调整它以匹配您的环境。

OP的解决方案:如果无法进行重建,可以使用root并添加用户来相应设置docker组。如果您在删除从属服务器上的组之前尝试了此操作(groupdel docker):

docker exec -it -u root myjenkins bash
container $ groupadd -g 993 docker
container $ usermod -aG docker jenkins
 类似资料:
  • 问题内容: 我在用于CI的docker设置中有一个docker。本质上,该机器上装有jenkins CI服务器,该服务器使用相同的机器docker套接字为CI创建节点。 直到我最近更新了docker为止,这一直很好。我已经确定了问题,但似乎无法找出正确的方法来使它起作用。 这就是我的猜测。我可以从容器中访问主机docker套接字,但似乎无法授予jenkins用户许可。 我已经添加了docker组,

  • 我的Dockerfile配置: 报错信息: 我已经尝试过以下几种方法: Dockerfile配置中添加RUN chmod -R 777 /yice Dockerfile配置添加 USER root,它会报: 找不Chrome,然后因为ghcr.io/puppeteer/puppeteer:latest镜像切换的用户名为pptruser,所以我手动在代码里给puppeteer配置executable

  • 问题内容: 我有两个Docker容器:Nginx和App。 该应用程序容器扩展了PHP-fpm,并具有我的Laravel代码。 在我的工作中: 在我的Nginx Dockerfile中,我正在做: 在我的App Dockerfile中,我正在做: 成功运行docker-compose up后,尝试localhost时出现以下错误 流或文件“ /var/www/storage/logs/larave

  • 我试图用docker运行一个简单的命令,读取我的主目录中的文件,并在本地机器上的同一目录中写入输出文件(

  • Docker安装在AWS EC2 Ubuntu 16.04实例上,如下所示: 引发权限被拒绝错误: 尝试连接到处的Docker守护程序套接字时,权限被拒绝unix:///var/run/docker.sock: 收到http:///var/run/docker.sock/v1.39/info: 拨号unix/var/run/docker.sock:connect:权限被拒绝 显示: uname-a

  • 问题内容: 我的Jenkins不在Docker容器中运行,只是传统安装到VPS。执行简单的测试项目时出现以下错误。我正在使用Ubuntu 14,java 7和稳定的Jenkins。我尝试了所有可以在Google上找到的方法,但无法正常工作。 我正在尝试执行此外壳 代码更改后。 这是错误: 我可以在控制台中以root身份运行“ docker”,这没问题,为什么jenkins无法尝试运行“ docke