使用 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
)
长话短说,我需要扩展 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
)