【问题标题】:How to get dockerfile to evaluate environment variables I sent to it?如何让 dockerfile 评估我发送给它的环境变量?
【发布时间】:2016-08-01 16:45:59
【问题描述】:

我在 docker 容器中运行 postgresql。我的系统分为两部分,一次性设置和运行时。运行一次性设置时,我让用户输入用户名、密码和 dbname,并使用这些名称创建一个超级用户和数据库:

docker run -e USERNAME=user -e PASSWORD=admin -e DBNAME=test myImage

这是来自 docker 文件 dockerfile 的 sn-p:

RUN /etc/init.d/postgresql start && psql --command "CREATE USER $USERNAME WITH SUPERUSER PASSWORD '$PASSWORD';" && createdb -O $USERNAME $DBNAME

我已经使用恒定的用户名、密码和数据库名称对这一切进行了测试,但是当我尝试传递环境变量时,我似乎无法让它工作。我想我之前读过一篇文章,其中指出 dockerfile 不会扩展环境变量,但我也听说过一些相互矛盾的信息,即环境变量是目前在 docker 中传递这些信息的最佳方式。

如何使上述 sn-p 工作?我只是使用不正确的语法让 docker 评估环境变量。

我还尝试检查正在运行的容器以确认环境变量设置正确(它们是正确的)。

【问题讨论】:

    标签: postgresql docker environment-variables


    【解决方案1】:

    我认为你误解了 RUN 在 Dockerfile 中的作用;也许您将它与“docker run”混淆了。看看 CMD 吧。

    注意:Dockerfile 的目的是构建镜像。容器是由“docker run”命令从镜像创建的进程。

    如果您想在创建容器时执行某些命令,可以将其指定为“docker run”的参数、Dockerfile 中的 CMD 或任一位置的入口点。

    【讨论】:

    • 谢谢,我查看了更多教程,对它的理解稍微好一点,但它打开了更多相关问题。对于这个特定的图像,我希望它在每次安装时都运行完全相同,所以我应该使用 ENTRYPOINT,但是我想依次运行三个命令作为其中的一部分(启动、创建超级用户、createdb)。我该如何指定?教程说如果你有多个入口点,只使用最后一个。
    • 您可以在图像中添加一个 shell 脚本。否则,如果用分号分隔,则可以将命令捆绑到单行中。
    • 要了解CMD和ENTRYPOINT的区别,看看hub.docker.com/r/k3ck3c/nethogs如果你运行它,它监控wlan0,如果你想监控ra1,你将在@末尾添加ra1 987654322@命令,运行3个命令,可以command1 ; command2 ; command3
    猜你喜欢
    • 2020-07-12
    • 2018-01-15
    • 2011-07-04
    • 1970-01-01
    • 2016-08-27
    • 2020-11-17
    • 2010-10-14
    • 1970-01-01
    • 2011-10-15
    相关资源
    最近更新 更多