挂载 /var/run/docker.sock 后,出现 "docker: not found" 问题

6

我想在容器内使用docker命令。 我使用这个命令来挂载/var/run/docker.sock并运行容器。

docker run -d --name gitlab-runner --restart always \                                                                  
  -v /var/run/docker.sock:/var/run/docker.sock \
  -v /srv/gitlab-runner/config:/etc/gitlab-runner \
  gitlab/gitlab-runner:latest

但是当我尝试在容器内(gitlab-runner)使用docker时,会出现错误。

docker: not found

主机:

srw-rw----  1 root docker    0 Mar 23 15:13 docker.sock

容器:

0 srw-rw---- 1 root gitlab-runner    0 Mar 23 15:13 docker.sock

在我删除旧容器并创建新容器之前,这个命令可以正常工作。现在我无法在容器内运行docker,请帮忙解决。


Docker 安装在哪个路径下?你能使用完整路径调用它吗? - Rodrigo Murillo
看起来GitLab Runner使用docker-machine(安装在此镜像内部)来自动扩展Runner,这可能是为什么您必须在内部挂载docker.sock套接字的原因。然而,我没有看到docker本身安装在此映像中,甚至找不到适当的修订版本。因此,看起来docker:not found是_预期_结果。如果您以前可以使用它,请假设您对运行容器进行了一些手动定制(例如手动安装docker),并忘记了这一点,因此容器重新启动时擦除了所有这些更改。 - Danila Kiver
2个回答

18
你需要区分docker守护程序和docker CLI。前者是一个服务,实际执行所有工作-构建和运行容器。后者是可执行文件,用于向守护进程发送命令。
可执行文件(docker CLI)轻巧且使用/var/run/docker.sock访问守护进程(默认情况下,实际上有不同的传输方式)。
当您使用-v /var/run/docker.sock:/var/run/docker.sock启动容器时,实际上是将主机的docker守护程序共享到容器中的docker CLI。因此,您仍然需要在容器内安装docker CLI以利用Docker,但不需要设置守护程序(这非常复杂,需要特权模式)。
结论:
在容器内安装docker CLI,共享套接字并享受其中。但是,在使用主机的docker守护程序时,您可能会因绑定挂载卷而感到困惑,因为守护程序无法看到容器的内部文件系统。

2
我在这里列出了添加Docker CLI和绑定挂载docker.sock的指令 https://dev59.com/JbLma4cB1Zd3GeqPfr81#55317547 - Bernard

0

我弄清楚为什么立即挂载docker.sock文件没有起作用。这是因为gitlab-runner容器没有docker.bin文件。

docker cp /usr/bin/docker gitlab-runner:/usr/bin/docker

您可以使用上述命令复制docker.bin文件,而无需安装它。与docker.sock挂载一起,这样在gitlab-runner容器中就可以正常运行docker命令。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接