Docker Compose部署Telegraf访问docker.sock的权限问题求助
问题描述
更新尝试
我参考相关方案修改Docker Compose配置如下:
telegraf3: image: telegraf user: telegraf:$$(stat -c '%g' /var/run/docker.sock) volumes: - ./telegraf/telegraf3.conf:/etc/telegraf/telegraf.conf - /var/run/docker.sock:/var/run/docker.sock
但启动时报错:
Error response from daemon: unable to find group $(stat -c '%g' /var/run/docker.sock): no matching entries in group file
背景
我通过Docker Compose部署带Docker输入插件的Telegraf,初始配置如下:
telegraf3: image: telegraf volumes: - ./telegraf/telegraf3.conf:/etc/telegraf/telegraf.conf - /var/run/docker.sock:/var/run/docker.sock:rw env_file: - ./telegraf/telegraf.env depends_on: - influxdb
运行时出现权限错误:
test-grafana-telegraf3-1 | 2022-12-29T12:09:10Z E! [inputs.docker] Error in plugin: Got permission denied while trying to connect to the Docker daemon socket at unix:///docker.sock: Get "http://%2Fdocker.sock/v1.24/info": dial unix /docker.sock: connect: permission denied
本质原因是Telegraf以telegraf用户运行,该用户没有访问docker.sock的权限。
其他尝试及报错
我还尝试修改command字段配置:
telegraf3: image: telegraf volumes: - ./telegraf/telegraf3.conf:/etc/telegraf/telegraf.conf - /var/run/docker.sock:/var/run/docker.sock:rw env_file: - ./telegraf/telegraf.env depends_on: - influxdb command: ["bash -c -u telegraf $$(stat -c '%g' /var/run/docker.sock)", "/entrypoint.sh"]
但启动后报错:
test-grafana-telegraf3-1 | setpriv: failed to execute bash -c -u telegraf $(stat -c '%g' /var/run/docker.sock): No such file or directory
容器以退出码127终止。
解决方案
方法1:直接指定Docker组ID
Docker Compose的user字段不会解析Shell命令,需先在宿主机执行以下命令获取docker.sock的组ID:
stat -c '%g' /var/run/docker.sock
得到结果(例如999)后,直接写入Compose配置:
telegraf3: image: telegraf user: telegraf:999 # 替换为你获取到的组ID volumes: - ./telegraf/telegraf3.conf:/etc/telegraf/telegraf.conf - /var/run/docker.sock:/var/run/docker.sock:rw env_file: - ./telegraf/telegraf.env depends_on: - influxdb
方法2:容器启动时动态添加权限
通过自定义entrypoint,在容器启动时将telegraf用户加入与docker.sock同组的用户组:
telegraf3: image: telegraf volumes: - ./telegraf/telegraf3.conf:/etc/telegraf/telegraf.conf - /var/run/docker.sock:/var/run/docker.sock:rw env_file: - ./telegraf/telegraf.env depends_on: - influxdb entrypoint: ["bash", "-c", "DOCKER_GID=$(stat -c '%g' /var/run/docker.sock) && groupadd -g $DOCKER_GID docker-access && usermod -aG docker-access telegraf && exec /entrypoint.sh"]
逻辑说明:
- 获取docker.sock的组ID
- 创建对应GID的用户组
- 将telegraf用户加入该组
- 执行原entrypoint脚本启动Telegraf
方法3:构建自定义Telegraf镜像
若需长期复用,可构建自定义镜像预先配置权限:
Dockerfile(./telegraf-custom/Dockerfile):
FROM telegraf RUN DOCKER_GID=$(stat -c '%g' /var/run/docker.sock) && groupadd -g $DOCKER_GID docker-access && usermod -aG docker-access telegraf
Compose配置:
telegraf3: build: ./telegraf-custom volumes: - ./telegraf/telegraf3.conf:/etc/telegraf/telegraf.conf - /var/run/docker.sock:/var/run/docker.sock:rw env_file: - ./telegraf/telegraf.env depends_on: - influxdb
内容的提问来源于stack exchange,提问作者Max Krog
相关产品推荐
相关产品推荐

