我为docker创建了一个托管postgresql服务器的映像。在dockerfile中,环境变量' USER'和我将一个常量密码传递给psql运行:
USER postgres
RUN /etc/init.d/postgresql start && psql --command "CREATE USER docker WITH SUPERUSER PASSWORD 'docker';" && createdb -O docker docker
理想情况下,在致电' docker run'之前或之后在此图片上,我希望调用者必须将这些详细信息输入命令行,这样我就不必将它们存储在任何地方。
我不确定如何解决这个问题。 docker是否支持将stdin读入环境变量?或者也许有更好的方法来处理这一切?
答案 0 :(得分:2)
您可以在Dockerfile中使用build arguments:
ARG password=defaultPassword
USER postgres
RUN /etc/init.d/postgresql start && psql --command "CREATE USER docker WITH SUPERUSER PASSWORD '$password';" && createdb -O docker docker
然后用:
构建$ docker build --build-arg password=superSecretPassword .
要在运行时设置密码,您可以使用可在入口点脚本(ENV
)中评估的环境变量(ENTRYPOINT
):
ENV PASSWORD=defaultPassword
ADD entrypoint.sh /docker-entrypoint.sh
USER postgres
ENTRYPOINT /docker-entrypoint.sh
CMD ["postgres"]
在入口点脚本中,您可以在容器启动后立即创建具有给定密码的新用户:
pg_ctl -D /var/lib/postgresql/data \
-o "-c listen_addresses='localhost'" \
-w start
psql --command "CREATE USER docker WITH SUPERUSER PASSWORD '$password';"
postgres pg_ctl -D /var/lib/postgresql/data -m fast -w stop
exec $@
您还可以查看Dockerfile的entrypoint script和official postgres image,我已从中借用了此答案中的大部分代码。
在环境变量(构建和运行时)中存储密码之类的秘密并不是非常安全(不幸的是,据我所知,Docker现在并没有为此提供任何更好的解决方案)。有关此主题的有趣讨论可以在this question中找到。
答案 1 :(得分:0)
您可以在Dockerfile中使用environment variable,并在使用-e或--env参数调用docker run时覆盖默认值。
此外,您还需要修改init脚本,以便在CMD指令引用的启动时运行psql命令。