扩展CouchDB Dockerfile实现启动时动态获取管理员账号密码
动态获取管理员账号的CouchDB Docker扩展方案
没问题,我帮你设计一个灵活的方案,让你的CouchDB容器每次启动时动态获取管理员账号密码,不用提前硬编码或者固定环境变量!
核心思路是替换CouchDB默认的入口脚本,在容器启动时先从外部源(比如Docker Secrets、挂载的文件)读取账号密码,再配置到CouchDB中,最后启动服务。这样既满足你“启动时动态获取”的需求,还能兼容原来的环境变量配置方式。
1. 编写自定义启动脚本
创建一个名为entrypoint.sh的脚本,负责读取外部凭证、配置CouchDB管理员,然后启动服务:
#!/bin/bash set -e # 优先从Docker Secrets读取凭证(适合Swarm/K8s集群场景) if [ -f /run/secrets/couchdb_user ]; then COUCHDB_USER=$(cat /run/secrets/couchdb_user) fi if [ -f /run/secrets/couchdb_password ]; then COUCHDB_PASSWORD=$(cat /run/secrets/couchdb_password) fi # 其次从指定路径的文件读取(适合手动挂载文件的单机场景) if [ -n "$COUCHDB_USER_FILE" ] && [ -f "$COUCHDB_USER_FILE" ]; then COUCHDB_USER=$(cat "$COUCHDB_USER_FILE") fi if [ -n "$COUCHDB_PASSWORD_FILE" ] && [ -f "$COUCHDB_PASSWORD_FILE" ]; then COUCHDB_PASSWORD=$(cat "$COUCHDB_PASSWORD_FILE") fi # 最后兼容原有的环境变量方式(保持向下兼容) # 检查是否获取到有效凭证 if [ -z "$COUCHDB_USER" ] || [ -z "$COUCHDB_PASSWORD" ]; then echo "❌ 错误:无法获取CouchDB管理员用户名或密码" echo "请通过以下方式之一提供:" echo "1. Docker Secrets: 创建couchdb_user和couchdb_password secret" echo "2. 挂载文件:设置COUCHDB_USER_FILE/COUCHDB_PASSWORD_FILE指向容器内的文件路径" echo "3. 环境变量:直接设置COUCHDB_USER和COUCHDB_PASSWORD" exit 1 fi # 生成CouchDB兼容的密码哈希(避免明文存储) PASSWORD_HASH=$(couchdb -e 'io:format("~s~n", [couch_passwords:hash_password(<<"'$COUCHDB_PASSWORD'">>)])') # 配置CouchDB管理员到local.ini INI_FILE="/opt/couchdb/etc/local.ini" # 如果没有[admins]段,就添加 if ! grep -q "\[admins\]" "$INI_FILE"; then echo -e "\n[admins]" >> "$INI_FILE" fi # 删除已存在的同名用户(避免重复配置) sed -i "/^$COUCHDB_USER=/d" "$INI_FILE" # 添加新的管理员条目 echo "$COUCHDB_USER=$PASSWORD_HASH" >> "$INI_FILE" # 确保数据目录权限正确(避免启动报错) chown -R couchdb:couchdb /opt/couchdb/data # 调用原有的CouchDB启动脚本 exec /docker-entrypoint.sh "$@"
2. 编写扩展后的Dockerfile
基于官方couchdb:2.1.1镜像,添加自定义脚本并替换入口点:
FROM couchdb:2.1.1 # 复制自定义启动脚本到容器内 COPY entrypoint.sh /usr/local/bin/ # 给脚本添加执行权限 RUN chmod +x /usr/local/bin/entrypoint.sh # 替换默认入口点为自定义脚本 ENTRYPOINT ["entrypoint.sh"]
3. 构建镜像并使用
方式1:Docker Secrets(推荐用于Swarm集群)
# 创建Secrets(替换成你的实际账号密码) echo "my_admin" | docker secret create couchdb_user - echo "my_secure_pass123" | docker secret create couchdb_password - # 启动服务 docker service create \ --name couchdb-service \ --secret couchdb_user \ --secret couchdb_password \ --publish 5984:5984 \ your-image-name:tag
方式2:挂载本地文件(适合单机测试/部署)
# 本地创建存储凭证的文件 echo "my_admin" > ./couchdb_user.txt echo "my_secure_pass123" > ./couchdb_password.txt # 启动容器,挂载文件到容器内的Secrets路径 docker run -d \ --name couchdb \ -p 5984:5984 \ -v $(pwd)/couchdb_user.txt:/run/secrets/couchdb_user \ -v $(pwd)/couchdb_password.txt:/run/secrets/couchdb_password \ -v couchdb-data:/opt/couchdb/data \ your-image-name:tag
方式3:兼容原有环境变量(保留旧用法)
如果你偶尔需要用原来的环境变量方式,直接设置即可:
docker run -d \ --name couchdb \ -p 5984:5984 \ -e COUCHDB_USER=my_admin \ -e COUCHDB_PASSWORD=my_secure_pass123 \ -v couchdb-data:/opt/couchdb/data \ your-image-name:tag
注意事项
- 如果你持久化了CouchDB的数据目录(比如上面的
couchdb-data卷),第一次启动配置的管理员会被保存在数据里,后续启动即使不提供凭证,也会沿用之前的配置。 - 确保挂载的凭证文件权限正确,容器内的
couchdb用户需要有读取权限(一般只要文件不是0600且属主不是root就行,或者启动时加--user调整)。
内容的提问来源于stack exchange,提问作者Kazz
相关产品推荐
相关产品推荐

