Docker rootless Error: you need to share your Docker host socket with a volume at /var/run/docker.sock
Docker rootless Error: you need to share your Docker host socket with a volume at /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
但是我得到以下错误:
ERROR: Volume unix://$XDG_RUNTIME_DIR/docker.sock:/tmp/docker.sock:ro
has incorrect format, should be external:internal[:mode]
只是因为卷路径中多了一个 :
冒号。
所以在这篇 Trying Rootless Docker with Testcontainers 文章中进一步挖掘,然后我尝试了
- $XDG_RUNTIME_DIR/docker.sock:/var/run/docker.sock:ro
但它也没有用,因为我得到了以下错误:
ERROR: Named volume "$XDG_RUNTIME_DIR/docker.sock:/tmp/docker.sock:ro"
is used in service "docker-gen-auto" but no declaration was found in
the volumes section.
最后我尝试在终端中回显 $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
而不是使用硬编码路径。
我正在尝试使用 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
但是我得到以下错误:
ERROR: Volume unix://$XDG_RUNTIME_DIR/docker.sock:/tmp/docker.sock:ro has incorrect format, should be external:internal[:mode]
只是因为卷路径中多了一个 :
冒号。
所以在这篇 Trying Rootless Docker with Testcontainers 文章中进一步挖掘,然后我尝试了
- $XDG_RUNTIME_DIR/docker.sock:/var/run/docker.sock:ro
但它也没有用,因为我得到了以下错误:
ERROR: Named volume "$XDG_RUNTIME_DIR/docker.sock:/tmp/docker.sock:ro" is used in service "docker-gen-auto" but no declaration was found in the volumes section.
最后我尝试在终端中回显 $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
而不是使用硬编码路径。