Docker 无根错误:您需要与位于 /var/run/docker.sock

问题描述

我正在尝试使用 Docker 实现无根化。

我已按照 official documentation 中提供的所有步骤进行操作。我还允许使用非特权端口,包括 443。

为了测试一切是否按我需要的方式工作,我安装了 "nginx-proxy-automation"

一切都安装得很好。 但是jrcs/letsencrypt-Nginx-proxy-companion:2.1 容器

version: '3'

services:
  Nginx-proxy-automation-letsencrypt:
    image: jrcs/letsencrypt-Nginx-proxy-companion:${Nginx_PROXY_COMPANION_IMAGE_VERSION:-2.0}
    container_name: ${LETS_ENCRYPT_SEVICE_NAME:-Nginx-proxy-automation-letsencrypt}
    restart: always
    volumes:
      - ${Nginx_FILES_PATH:-./data}/conf.d:/etc/Nginx/conf.d
      - ${Nginx_FILES_PATH:-./data}/vhost.d:/etc/Nginx/vhost.d
      - ${Nginx_FILES_PATH:-./data}/html:/usr/share/Nginx/html
      - ${Nginx_FILES_PATH:-./data}/certs:/etc/Nginx/certs:rw
      - ${Nginx_FILES_PATH:-./data}/acme.sh:/etc/acme.sh
      - /var/run/docker.sock:/var/run/docker.sock:ro

报如下错误

Error: you need to share your Docker host socket with a volume at /var/run/docker.sock
Typically you should run your container with: '-v /var/run/docker.sock:/var/run/docker.sock:ro' 
Info: running acme-companion version v2.1.0

这会导致容器每 x 秒重新启动一次。

我能做些什么来修复它?我错过了什么?

​​解决方法

基于@gdahlm 的回答,我首先尝试了以下方法

- unix://$XDG_RUNTIME_DIR/docker.sock:/var/run/docker.sock:ro

但我收到以下错误

错误:卷 unix://$XDG_RUNTIME_DIR/docker.sock:/tmp/docker.sock:ro 格式不正确,应该是 external:internal[:mode]

仅仅是因为卷路径中有一个额外的 : 冒号。

因此在这Trying Rootless Docker with Testcontainers 文章中进一步挖掘,然后我尝试了

- $XDG_RUNTIME_DIR/docker.sock:/var/run/docker.sock:ro

但它也不起作用,因为我收到以下错误

错误:命名卷“$XDG_RUNTIME_DIR/docker.sock:/tmp/docker.sock:ro” 用于服务“docker-gen-auto”,但未在其中找到声明 卷部分。

最后,我尝试在终端中回显 $XDG_RUNTIME_DIR,如下所示:

$ echo $XDG_RUNTIME_DIR

我得到了:

/run/user/1000

因此,我将其硬编码到 .env 文件变量中:

DOCKER_HOST_ROOTLESS_PATH=/run/user/1000/docker.sock

并在 docker-compose.yml 文件

  - ${DOCKER_HOST_ROOTLESS_PATH:-/var/run/docker.sock}:/tmp/docker.sock:ro

终于成功了!

但将其保留在 .env 文件中:

DOCKER_HOST_ROOTLESS_PATH=$XDG_RUNTIME_DIR/docker.sock

没有用。

解决方法

这是一个 jrcs/letsencrypt-nginx-proxy-companion 特定的错误,如果您查看 docker-compose.yml,您会看到这一点。

    - "/var/run/docker.sock:/var/run/docker.sock:ro"

尝试将其更改为:

   - "unix://$XDG_RUNTIME_DIR/docker.sock:/var/run/docker.sock:ro"

但该值可能会根据您的安装配置方式而改变。

jrcs/letsencrypt-nginx-proxy-companion 的维护者确实需要转而使用 $DOCKER_HOST,而不是使用硬编码路径。