我如何处理密码和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命令。