在 Elastic Beanstalk 上设置 Docker 容器主机名

Posted

技术标签:

【中文标题】在 Elastic Beanstalk 上设置 Docker 容器主机名【英文标题】:Setting Docker container hostname on Elastic Beanstalk 【发布时间】:2015-04-26 05:01:59 【问题描述】:

我想手动设置部署在 AWS Elastic Beanstalk 上的 Docker 容器的主机名。您可以在使用docker run -h HOSTNAME 启动容器时设置主机名,但我不知道如何(甚至是否)将自定义参数传递给docker run 命令。

Dockerrun.aws.json 文件似乎是一个可能的候选者,但没有记录的密钥可以满足我的需求。

有人知道这是否可行吗?

【问题讨论】:

【参考方案1】:

据我所知,这不支持开箱即用。

这里的一个可能的技巧是利用 EB 对环境变量的不良解析。您可以设置环境变量,例如:PARAM1=dummy -h MYHOSTNAME EB 不引用参数,因此您的 -h 部分将嵌入到 docker run 命令中。 我自己没试过。

另一种选择是创建一个ebextension 文件来修补/opt/elasticbeanstalk/hooks/appdeploy/pre/04run.sh 脚本,将-h MYHOST 行注入其中。

【讨论】:

看起来很有趣!我会试一试并报告。 您的问题解决了吗?我有同样的问题,并为此苦苦挣扎了几天。【参考方案2】:

不确定单个 docker 容器部署,即 v1,因为我还没有尝试过,但 v2 (即多容器部署)肯定支持它们。您可以通过在Dockerrun.aws.json 中添加容器主机名 -

  "hostname": "this-is-my-container-hostname"

【讨论】:

我不认为这是正确的。我在文档中也找不到。 在发布我之前的评论后,我打开了一张支持票,AWS 支持代表看到了同样的 *** 帖子,并确认此页面上的任何方法答案都不起作用。这些脚本已被弃用,取而代之的是其内部 ECS 代理。他们建议我探索 ECS,因为它为此提供了更多控制/选项。 这看起来像是在我的文档中。 Elastic Beanstalk 的多容器配置指出配置文件格式与 ECS 任务定义相同。该文档支持主机名参数。在这里找到:docs.aws.amazon.com/AmazonECS/latest/developerguide/… 还值得一提的是,您必须有“链接”部分,并且网络必须处于桥接模式才能使这些工作。【参考方案3】:

您可以通过将容器的主机名定义为环境变量来设置它。

HOSTNAME=your-name

【讨论】:

【参考方案4】:

如果您有多个实例,我们会使用下一个脚本修补旧平台,但您可以将其移植到新平台。 .ebextensions/01-docker-hostname.config 示例:

files:
  "/opt/elasticbeanstalk/hooks/appdeploy/pre/04a_set_hostname.sh":
    mode: "000755"
    owner: root
    group: root
    content: |
      #!/usr/bin/env bash
      hostname $(hostname -f | cut -d"." -f1,2)
      sed -i "s/docker run -d \\\/docker run -d -h $(hostname) \\\/" /opt/elasticbeanstalk/hooks/appdeploy/enact/04run.sh

如您所见,我们的脚本总是修补运行脚本。 EB 按文件名顺序运行脚本。所以你应该确保你的脚本在运行脚本之前运行。

【讨论】:

以上是关于在 Elastic Beanstalk 上设置 Docker 容器主机名的主要内容,如果未能解决你的问题,请参考以下文章

在 Elastic Beanstalk 上设置 Docker 容器主机名

使用 Postgres 在 Elastic Beanstalk 上设置 Django

如何在 AWS Elastic Beanstalk 上设置 HTTPS

如何在 AWS Elastic Beanstalk 上设置 HTTPS

在 AWS Elastic Beanstalk 上设置 Django:未找到 WSGIPath

如何在 Elastic Beanstalk 上设置延迟作业时修复“需要”错误