使用 python 设置 dockerized Couchdb

Setting up dockerized Couchdb with python

长话短说,我需要扩展 apache/couchdb/ Dockerfile,以便进行一些神奇的处理以获取 2 个值(用户名和密码),然后使用管理员启动 couchdb 实例。

通常你会通过 运行ning docker run ... -e COUCHDB_USER=admin -e COUCHDB_PASSWORD=password couchdb 来完成,但我可能事先不知道这些值,我希望每次容器启动时从某个地方检索这些值。

我制作了一个大致如下所示的 Dockerfile:

FROM couchdb:2.1.1
RUN apt-get update --force-yes && apt-get install -y python3
RUN curl https://bootstrap.pypa.io/get-pip.py | python3
ADD . /app
RUN pip install -r /app/requirements.txt
CMD ["python3", "/app/start_couch.py"]

其中 start_couch.py 看起来像这样:

import os
import subprocess

user,password = very_complex_stuff()

os.environ['COUCHDB_USER'] = user
os.environ['COUCHDB_PASSWORD'] = password

subprocess.call(["/opt/couchdb/bin/couchdb"], env=os.environ)

然而,当构建和 运行 我的图像时,couchdb 在没有预先设置的管理员的情况下启动(我的意思是我可以在没有登录的情况下做任何事情)

有人可以指出我做错了什么或提出不同的解决方案吗?

标准是管理员凭证取自 python 脚本(函数),需要在 docker run

上执行

... couchdb starts without a pre-set admin (I mean i can do everything without login) ...

这叫做 The Admin Party 如果您不修改 CouchDB 的安全配置,这是默认配置。如果您查看文档,它就会开始变得有意义。

谜团解开

该图像有一个自定义入口点 ENTRYPOINT ["tini", "--", "/docker-entrypoint.sh"],因此 -e 开关在执行 .sh 之前设置环境变量,但是我的 python 脚本是 运行 稍后.

我通过更改添加到 Dockerfile 来解决这个问题

ENTRYPOINT ["tini", "--"]
CMD ["python3", "/app/start_couch.py"]

并像这样从 python 呼叫沙发:

subprocess.call(
    ["/docker-entrypoint.sh", "/opt/couchdb/bin/couchdb"],
    env=os.environ
)