【问题标题】:Alias service environment var in a Docker containerDocker 容器中的别名服务环境变量
【发布时间】:2015-07-07 16:36:33
【问题描述】:

我使用 Docker Compose 来启动我的容器。我有一个 RethinkDB 服务容器,它在以下环境变量中公开(以及其他)主机端口:APP_RETHINKDB_1_PORT_28015_TCP_ADDR

但是,我的应用必须将此主机作为名为 RETHINKDB_HOST 的环境变量接收。

我的问题是:如何在启动容器时将给定的 env var 别名为所需的(最好以最 Dockerish 的方式)?我试过了:

env_file: .env
environment:
  - RETHINKDB_HOST=$APP_RETHINKDB_1_PORT_28015_TCP_ADDR

但首先,它不起作用,其次,它看起来不是最好的方法。

【问题讨论】:

  • 如果您的应用可以使用启动脚本,您可以在该脚本中进行分配。我的意思是您的应用程序的入口点可以是,例如 /start。 /start 完成您的任务,然后执行您的应用程序。这是一个很好的问题,我认为在 compose.yaml 中没有办法做到这一点。
  • 我想过这个,但我真的不喜欢这种方法。
  • 脚本可能是最好的方法。来自链接的环境是在其他环境变量之后设置的,因此您不能以这种方式引用链接。除非您想更改 RethinkDB 以使用 Compose 友好的环境变量名称,否则您的选项会受到限制。
  • 如何使用一个使用RETHINKDB_HOST=$APP_RETHINKDB_1_PORT_28015_TCP_ADDR的.env文件

标签: docker environment-variables docker-compose


【解决方案1】:

您尝试使用的环境变量名称APP_RETHINKDB_1_PORT_28015_TCP_ADDR 已包含端口号。它已经是一种“硬编码”。我想你只需要使用这个

environment:
  - RETHINKDB_HOST=28015

【讨论】:

    【解决方案2】:

    当一个容器链接到另一个容器时,它会设置环境变量,但也会设置一个主机条目。例如,

    ubuntu:
        links:
            rethinkdb:rethinkdb 
    

    将允许 ubuntu 到 ping rethinkdb 并让它解析 IP 地址。这将允许您设置RETHINKDB_HOST=rethinkdb。但是,如果您依赖该端口的变量,这将不起作用,但这是除了添加启动脚本或修改您的 CMD 之外我能想到的唯一事情。

    如果您想修改当前设置为command: service rethink startCMD,例如,只需将其更改为添加变量赋值,例如

    command: sh -c 'RETHINKDB_HOST=$APP_RETHINKDB_1_PORT_28015_TCP_ADDR && service rethink start'
    

    如果您使用的是启动脚本,方法类似,您只需在服务启动之前将该变量赋值添加为一行

    【讨论】:

    • 如果我听从你的建议,$APP_RETHINKDB_1_PORT_28015_TCP_ADDR 会在那里吗?
    • 你说你的 RethinkDB 服务容器“暴露”了环境变量APP_RETHINKDB_1_PORT_28015_TCP_ADDR。这是否意味着一旦容器运行它就可用/设置?该变量似乎是链接到 rethinkdb 容器的结果。如果是这样的话,是的,当command 尝试使用它时它就已经存在了。 RUN 指令和 CMD 指令之间的区别在于 CMD 发生在运行时,而 RUN 发生在构建期间。因此,环境变量和链接的主机名可用于CMD,而它们在RUN 中不起作用
    • 顺便说一句:rethinkdb 是多余的
    猜你喜欢
    • 1970-01-01
    • 2016-05-30
    • 1970-01-01
    • 1970-01-01
    • 2016-03-07
    • 1970-01-01
    • 2017-12-26
    • 2019-06-26
    • 1970-01-01
    相关资源
    最近更新 更多