在Docker容器启动CouchDB时如何创建_users数据库?
_users数据库不存在的错误 问题场景
你的Dockerfile配置如下:
FROM couchdb:latest EXPOSE 5984 COPY local.ini /opt/couchdb/etc/
尽管在local.ini中配置了[admins]段,启动时仍报错:
[error] 2022-11-06T17:55:49.799365Z nonode@nohost emulator -------- Error in process <0.15793.0> with exit value:
{database_does_not_exist,[{mem3_shards,load_shards_from_db,"_users",[{file,"src/mem3_shards.erl"},{line,400}]},{mem3_shards,load_shards_from_disk,1,[{file,"src/mem3_shards.erl"},{line,375}]},{mem3_shards,load_shards_from_disk,2,[{file,"src/mem3_shards.erl"},{line,404}]},{mem3_shards,for_docid,3,[{file,"src/mem3_shards.erl"},{line,97}]},{fabric_doc_open,go,3,[{file,"src/fabric_doc_open.erl"},{line,39}]},{chttpd_auth_cache,ensure_auth_ddoc_exists,2,[{file,"src/chttpd_auth_cache.erl"},{line,198}]},{chttpd_auth_cache,listen_for_changes,1,[{file,"src/chttpd_auth_cache.erl"},{line,145}]}]}
错误原因
配置[admins]后,CouchDB会依赖_users系统数据库完成权限校验,但首次启动时该数据库未被自动初始化;同时直接覆盖local.ini可能丢失默认配置,导致初始化流程异常。
解决方案
方案1:用环境变量设置管理员(推荐)
无需手动修改local.ini,通过官方支持的环境变量配置管理员,CouchDB会自动完成_users等系统数据库的初始化:
- 启动容器时传入变量:
docker run -e COUCHDB_USER=admin -e COUCHDB_PASSWORD=your_secure_password -p 5984:5984 your-couchdb-image
- 或写入Dockerfile:
FROM couchdb:3.3.2 # 建议指定具体版本,避免latest标签的兼容性问题 EXPOSE 5984 ENV COUCHDB_USER=admin ENV COUCHDB_PASSWORD=your_secure_password
方案2:保留默认配置+手动初始化系统数据库
若坚持使用自定义local.ini,需按以下步骤操作:
- 继承默认配置:先从官方CouchDB镜像中拷贝默认
local.ini,在其基础上添加[admins]段,不要完全覆盖原文件。 - 添加初始化脚本:在容器启动时自动创建系统数据库,创建
init-dbs.sh脚本:
#!/bin/bash # 等待CouchDB启动完成 sleep 10 # 创建系统数据库 curl -X PUT http://localhost:5984/_users curl -X PUT http://localhost:5984/_replicator curl -X PUT http://localhost:5984/_global_changes
- 修改Dockerfile:
FROM couchdb:3.3.2 EXPOSE 5984 COPY local.ini /opt/couchdb/etc/ # 配置文件权限修正 RUN chown couchdb:couchdb /opt/couchdb/etc/local.ini # 添加初始化脚本 COPY init-dbs.sh /docker-entrypoint-initdb.d/ RUN chmod +x /docker-entrypoint-initdb.d/init-dbs.sh
额外注意
- 避免使用
latest标签,指定具体CouchDB版本可减少版本迭代带来的兼容问题。 - 确保
local.ini的所有者为couchdb用户,否则会因权限问题导致配置无法加载。
内容的提问来源于stack exchange,提问作者Alex R

