我正在尝试扩展CouchDB docker映像以预填充CouchDB(带有初始数据库,设计文档等)。
为了创建一个名为的数据库db,我首先尝试了以下缩写Dockerfile:
db
Dockerfile
FROM couchdb RUN curl -X PUT localhost:5984/db
但是构建失败,因为在构建时尚未启动ouchdb服务。所以我将其更改为:
FROM couchdb RUN service couchdb start && \ sleep 3 && \ curl -s -S -X PUT localhost:5984/db && \ curl -s -S localhost:5984/_all_dbs
注意:
sleep
--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映像中:
test3
$ docker run -p 5984:5984 -d test3 b34ad93f716e5f6ee68d5b921cc07f6e1c736d8a00e354a5c25f5c051ec01e34 $ curl localhost:5984/_all_dbs []
大多数标准Docker数据库映像都包含VOLUME一行,以防止使用预填充的数据创建派生映像。对于官方couchdb图像,您可以在中看到相关行Dockerfile。与关系数据库映像不同,此映像不支持首次启动时运行的脚本。
VOLUME
couchdb
这意味着您需要从主机或另一个容器进行初始化。如果您可以使用其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