如何处理密码和dockerfiles?

时间:2016-04-08 14:50:06

标签: postgresql docker passwords

我为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读入环境变量?或者也许有更好的方法来处理这一切?

2 个答案:

答案 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 $@

您还可以查看Dockerfileentrypoint scriptofficial postgres image,我已从中借用了此答案中的大部分代码。

关于安全的说明

在环境变量(构建和运行时)中存储密码之类的秘密并不是非常安全(不幸的是,据我所知,Docker现在并没有为此提供任何更好的解决方案)。有关此主题的有趣讨论可以在this question中找到。

答案 1 :(得分:0)

您可以在Dockerfile中使用environment variable,并在使用-e或--env参数调用docker run时覆盖默认值。

此外,您还需要修改init脚本,以便在CMD指令引用的启动时运行psql命令。