我如何处理密码和dockerfiles?

我已经为docker托pipe了一个postgresql服务器。 在dockerfile中,环境variables'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”之前还是之后,我都希望调用者必须将这些细节input到命令行中,这样我就不必将它们存储在任何地方。

我不太清楚如何去做这件事。 docker是否支持将stdin读入环境variables? 或者也许有更好的方式来处理这一切呢?

在build造时间

您可以在Dockerfile中使用构build参数 :

 ARG password=defaultPassword USER postgres RUN /etc/init.d/postgresql start && psql --command "CREATE USER docker WITH SUPERUSER PASSWORD '$password';" && createdb -O docker docker 

然后搭build:

 $ docker build --build-arg password=superSecretPassword . 

在运行时

要在运行时设置密码,可以使用可在入口点脚本(入口ENTRYPOINT )中评估的环境variables( ENV ):

 ENV PASSWORD=defaultPassword ADD entrypoint.sh /docker-entrypoint.sh USER postgres ENTRYPOINT /docker-entrypoint.sh CMD ["postgres"] 

在入口脚本中,只要容器启动,就可以使用给定的密码创build一个新用户:

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

你也可以看看官方postgres镜像的Dockerfile和入口点脚本 ,我从中借用了这个答案中的大部分代码。

关于安全性的说明

在环境variables(包括构build和运行时间)中存储密码等秘密并不是非常安全(不幸的是,据我所知,Docker现在还没有提供任何更好的解决scheme)。 在这个问题上可以find关于这个话题的一个有趣的讨论。

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

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