在 Docker 中部署 etcd 并解决权限问题实战指南,成功解决permission denied问题!

在 Docker 中部署 etcd 并解决权限问题实战指南,成功解决permission denied问题!

etcd 是一个分布式的键值存储系统,广泛用于服务发现和配置共享。本文将演示如何通过 Docker Compose 部署单节点 etcd 服务,并深入解析其配置文件,重点说明如何通过修改 command 和用户权限解决常见的数据目录权限问题。


成功解决由于之前的执行命令一直报错:"fatal etcdmain/etcd.go:435 > ts=2025-05-31T22:40:28.646295+0800 msg=failed to list data directory dir=/bitnami/etcd/data error=open /bitnami/etcd/data: permission denied stacktrace=go.etcd.io/etcd/server/v3/etcdmain.identifyDataDirOrDie".

一、Docker Compose 文件解析

以下是基于 Bitnami 官方镜像(bitnami/etcd:3.5.21)的部署配置:

yaml 复制代码
services:
  etcd-standalone:

    cap_drop:
      - "AUDIT_CONTROL"
      - "BLOCK_SUSPEND"
      - "DAC_READ_SEARCH"
      - "IPC_LOCK"
      - "IPC_OWNER"
      - "LEASE"
      - "LINUX_IMMUTABLE"
      - "MAC_ADMIN"
      - "MAC_OVERRIDE"
      - "NET_ADMIN"
      - "NET_BROADCAST"
      - "SYSLOG"
      - "SYS_ADMIN"
      - "SYS_BOOT"
      - "SYS_MODULE"
      - "SYS_NICE"
      - "SYS_PACCT"
      - "SYS_PTRACE"
      - "SYS_RAWIO"
      - "SYS_RESOURCE"
      - "SYS_TIME"
      - "SYS_TTY_CONFIG"
      - "WAKE_ALARM"

    command:
      - "etcd"

    container_name: "etcd-standalone"

    entrypoint:
      - "/opt/bitnami/scripts/etcd/entrypoint.sh"

    environment:
      - "ETCD_TRUSTED_CA_FILE="
      - "MODULE=etcd"
      - "HOSTNAME=21dacb18aa69"
      - "ETCD_LISTEN_CLIENT_URLS=http://0.0.0.0:2379"
      - "BITNAMI_ROOT_DIR=/opt/bitnami"
      - "ETCD_CONF_FILE=/opt/bitnami/etcd/conf/etcd.yaml"
      - "ETCD_SNAPSHOT_HISTORY_LIMIT=1"
      - "PWD=/opt/bitnami/etcd"
      - "OS_FLAVOUR=debian-12"
      - "ETCD_AUTO_TLS=false"
      - "ETCD_EXTRA_AUTH_FLAGS="
      - "ETCD_LISTEN_PEER_URLS="
      - "TZ=Asia/Shanghai"
      - "ETCD_ON_K8S=no"
      - "ETCD_SNAPSHOTS_DIR=/snapshots"
      - "HOME=/"
      - "ETCDCTL_API=3"
      - "LANG=C.UTF-8"
      - "ETCD_BIN_DIR=/opt/bitnami/etcd/bin"
      - "ETCD_VOLUME_DIR=/bitnami/etcd"
      - "ETCD_INITIAL_CLUSTER_TOKEN=<token>"
      - "ETCD_DEFAULT_CONF_DIR=/opt/bitnami/etcd/conf.default"
      - "ETCD_LOG_LEVEL=info"
      - "BITNAMI_DEBUG=false"
      - "ETCD_NAME=etcd-single"
      - "ETCD_ROOT_PASSWORD=<password>"
      - "ETCD_PEER_AUTO_TLS=false"
      - "ETCD_CLUSTER_DOMAIN="
      - "ETCD_DISASTER_RECOVERY=no"
      - "TERM=xterm-256color"
      - "ETCD_KEY_FILE="
      - "ETCD_CONF_DIR=/opt/bitnami/etcd/conf"
      - "GID=0"
      - "ETCD_DAEMON_GROUP=etcd"
      - "SHLVL=1"
      - "ETCD_START_FROM_SNAPSHOT=no"
      - "BITNAMI_VOLUME_DIR=/bitnami"
      - "BITNAMI_APP_NAME=etcd"
      - "ETCD_DATA_DIR=/bitnami/etcd/data"
      - "ETCD_INIT_SNAPSHOT_FILENAME="
      - "ETCD_CLIENT_CERT_AUTH=false"
      - "ETCD_INIT_SNAPSHOTS_DIR=/init-snapshot"
      - "APP_VERSION=3.5.21"
      - "ALLOW_NONE_AUTHENTICATION=no"
      - "ETCD_TMP_DIR=/opt/bitnami/etcd/tmp"
      - "LC_ALL=C.UTF-8"
      - "ETCD_INITIAL_CLUSTER_STATE=new"
      - "ETCD_BASE_DIR=/opt/bitnami/etcd"
      - "ETCD_INITIAL_CLUSTER="
      - "OS_NAME=linux"
      - "PATH=/opt/bitnami/etcd/bin:/opt/bitnami/common/bin:/opt/bitnami/common/bin:/opt/bitnami/etcd/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
      - "ETCD_ADVERTISE_CLIENT_URLS=http://0.0.0.0:2379"
      - "UID=0"
      - "ETCD_CERT_FILE="
      - "ETCD_NEW_MEMBERS_ENV_FILE=/bitnami/etcd/data/new_member_envs"
      - "ETCD_DAEMON_USER=etcd"
      - "ETCD_INITIAL_ADVERTISE_PEER_URLS="
      - "OS_ARCH=amd64"

    hostname: "21dacb18aa69"

    image: "bitnami/etcd:3.5.21"

    ipc: "private"

    labels:
      com.docker.compose.config-hash: "d5eb79be0b5b707e751d33061dbfae8aaa0eec65603904b4a3fb4812c93203c9"
      com.docker.compose.container-number: "1"
      com.docker.compose.depends_on: ""
      com.docker.compose.image: "sha256:3389325d940ed0969c2315f09646606a0a9993d682e407630813413e5aad88d7"
      com.docker.compose.oneoff: "False"
      com.docker.compose.project: "etcd-standalone"
      com.docker.compose.project.config_files: ""
      com.docker.compose.project.working_dir: "/data/compose/62"
      com.docker.compose.replace: "c104121772833e6676b12b389ff21bd889aa56080307159042b6eb11b7a51990"
      com.docker.compose.service: "etcd-standalone"
      com.docker.compose.version: ""
      com.vmware.cp.artifact.flavor: "sha256:c50c90cfd9d12b445b011e6ad529f1ad3daea45c26d20b00732fae3cd71f6a83"
      org.opencontainers.image.base.name: "docker.io/bitnami/minideb:bookworm"
      org.opencontainers.image.created: "2025-05-17T19:09:40Z"
      org.opencontainers.image.description: "Application packaged by Broadcom, Inc."
      org.opencontainers.image.documentation: "https://github.com/bitnami/containers/tree/main/bitnami/etcd/README.md" 
      org.opencontainers.image.ref.name: "3.5.21-debian-12-r6"
      org.opencontainers.image.source: "https://github.com/bitnami/containers/tree/main/bitnami/etcd" 
      org.opencontainers.image.title: "etcd"
      org.opencontainers.image.vendor: "Broadcom, Inc."
      org.opencontainers.image.version: "3.5.21"

    logging:
      driver: "json-file"
      options:
        max-file: "3"
        max-size: "10m"

    networks:
      - "mount-etcd_default"

    ports:
      - "2379:2379/tcp"
      - "2380:2380/tcp"

    privileged: true

    restart: "always"

    security_opt:
      - "label=disable"

    stdin_open: true

    tty: true

    user: "0:0"

    volumes:
      - "<data-path>/etcd-data:/bitnami/etcd/data"

    working_dir: "/opt/bitnami/etcd"
version: "3.6"

networks:
  mount-etcd_default:
    driver: bridge
    external: false
    name: "mount-etcd_default"
    
    enable_ipv6: true  # 启用IPv6支持 [[5]][[9]]
    ipam:
      config:
        - subnet: 172.20.0.0/24       # IPv4子网 [[2]]
          gateway: 172.20.0.1
        - subnet: fc01:db8:21:172::/64     # IPv6子网(示例,需符合实际网络规划)
          gateway: fc01:db8:21:172::1

二、关键配置项详解

1. 权限配置(解决核心问题)

问题现象:

容器启动时报错:

bash 复制代码
permission denied stacktrace=go.etcd.io/etcd/server/v3/etcdmain.identifyDataDirOrDie

原因 :Bitnami 镜像默认使用 UID=1001 的非特权用户运行,但挂载的宿主机目录 /bitnami/etcd/data 权限不足。

解决方案:
  • 修改 UID :通过 UID=0user: "0:0" 配置,容器内进程以 root 权限运行 。
  • 提升容器权限privileged: truesecurity_opt: label=disable 允许容器绕过部分安全限制,确保对挂载目录的完全访问。

2. 启动命令优化

  • 原镜像行为 :Bitnami 镜像通过 entrypoint.sh 脚本初始化配置并启动 etcd。但若需自定义启动参数,可直接修改 command
  • 修改后的效果command: ["etcd"] 直接调用 etcd 二进制文件,跳过部分初始化逻辑,适用于已配置好的环境变量 。

3. 数据持久化

  • 通过 volumes 将宿主机的 <data-path>/etcd-data 挂载到容器内的 /bitnami/etcd/data,确保 etcd 数据持久化存储 。

4. 网络与安全

  • 端口映射:2379(客户端)和 2380(集群通信)端口开放。
  • 网络模式:使用自定义桥接网络并启用 IPv6 支持 。
  • 安全配置cap_drop 移除了不必要的内核权限,平衡安全性与功能性 。

三、部署与验证

  1. 启动容器

    bash 复制代码
    docker-compose up -d
  2. 验证 etcd 服务

    bash 复制代码
    etcdctl --endpoints=http://localhost:2379 put foo "Hello etcd"
    etcdctl --endpoints=http://localhost:2379 get foo
  3. 检查日志

    bash 复制代码
    docker logs etcd-standalone

四、总结

本文通过修改 command 和用户权限配置,成功解决了 etcd 容器因权限不足无法访问数据目录的问题。关键点包括:

  • Bitnami 镜像的默认 UID 配置可能导致权限冲突,需根据实际需求调整 。
  • 直接指定 command 可简化启动流程,但需确保环境变量完整配置 。
  • 容器权限提升(privilegedsecurity_opt)需谨慎使用,建议仅在可信环境中启用 。

通过上述配置,您已成功部署了一个稳定运行的 etcd 单节点服务,适用于开发测试或轻量级生产场景。

相关推荐
三金C_C9 小时前
docker 部署 gin
docker·容器·gin
家庭云计算专家10 小时前
Portainer安装指南:多节点监控的docker管理面板-家庭云计算专家
docker
长勺10 小时前
docker常见考点
docker·容器
迢迢星万里灬10 小时前
Java求职者面试指南:DevOps技术栈深度解析
java·ci/cd·docker·kubernetes·jenkins·devops
喝养乐多长不高11 小时前
深入探讨redis:万字讲解集群
java·数据库·redis·docker·集群·集群扩容·数据分片算法
玩电脑的辣条哥12 小时前
如何用docker部署ELK?
elk·docker·容器
Chuncheng's blog14 小时前
CentOS 7 安装docker缺少slirp4netnsy依赖解决方案
运维·docker·容器
我的golang之路果然有问题17 小时前
GO+RabbitMQ+Gin+Gorm+docker 部署 demo
笔记·后端·学习·docker·golang·rabbitmq·gin
David爱编程17 小时前
从 0 到 1 快速掌握 Docker 基本操作
后端·docker·容器
手心里的白日梦17 小时前
Docker Compose(容器编排)
docker