扩展CouchDB Docker映像

ecbunoof  于 2022-12-16  发布在  CouchDB
关注(0)|答案(1)|浏览(202)

我正在尝试扩展CouchDB docker映像以预填充CouchDB(使用初始数据库、设计文档等)。
为了创建一个名为db的数据库,我首先尝试了这个初始值Dockerfile

FROM couchdb
RUN curl -X PUT localhost:5984/db

但是构建失败了,因为couchdb服务在构建时还没有启动,所以我把它改成了:

FROM couchdb
RUN service couchdb start && \ 
  sleep 3 && \                 
  curl -s -S -X PUT localhost:5984/db && \
  curl -s -S localhost:5984/_all_dbs

注:

  • sleep是我找到的使它工作的唯一方法,因为它不能与curl选项--connect-timeout一起工作,
  • 第二个curl仅用于检查数据库是否已创建。

构建似乎运行良好:

$ docker build . -t test3 --no-cache
Sending build context to Docker daemon  6.656kB
Step 1/2 : FROM couchdb
 ---> 7f64c92d91fb
Step 2/2 : RUN service couchdb start &&   sleep 3 &&   curl -s -S -X PUT localhost:5984/db &&   curl -s -S localhost:5984/_all_dbs
 ---> Running in 1f3b10080595
Starting Apache CouchDB: couchdb.
{"ok":true}
["db"]
Removing intermediate container 1f3b10080595
 ---> 7d733188a423
Successfully built 7d733188a423
Successfully tagged test3:latest

奇怪的是,现在当我将其作为容器启动时,数据库db似乎没有保存到test3映像中:

$ docker run -p 5984:5984 -d test3
b34ad93f716e5f6ee68d5b921cc07f6e1c736d8a00e354a5c25f5c051ec01e34

$ curl localhost:5984/_all_dbs
[]
s5a0g9ez

s5a0g9ez1#

大多数标准Docker数据库映像都包含一个VOLUME行,用于防止创建带有预填充数据的派生映像。对于official couchdb image,您可以在其Dockerfile中看到相关行。与关系数据库映像不同,此映像不支持在首次启动时运行的脚本。
这意味着您需要从主机或另一个容器进行初始化。如果您可以使用HTTP API直接与它交互,则如下所示:

# Start the container
docker run -d -p 5984:5984 -v ... couchdb

# Wait for it to be up
for i in $(seq 20); do
  if curl -s http://localhost:5984 >/dev/null 2>&1; then
    break
  fi
  sleep 1
done

# Create the database
curl -XPUT http://localhost:5984/db

相关问题