python - 使用 python 设置 dockerized Couchdb

标签 python docker subprocess environment-variables couchdb

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

通常你会通过运行 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 上执行

最佳答案

解开了谜团

那个图像有一个自定义入口点 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
)

关于python - 使用 python 设置 dockerized Couchdb,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49738508/

相关文章:

python - 让标准输出显示包含输入的调用脚本

python - 仅从 subprocess.check_output 获取 stderr 输出

python - 运行 func(df) 创建新的数据帧并重命名它们

php - 找不到Docker命令中Alpine下的PHP7

docker - 无法在Docker Ubuntu镜像中安装软件包

docker - 使用 docker 运行 jmeter

python - subprocess.check_call 与标准输入

python - 描述没有重复的图例

Python Pandas 从变量创建 Dataframe 列

python - Pyramid 和 FormAlchemy 管理界面