【问题标题】:Docker container hostnameDocker 容器主机名
【发布时间】:2017-07-12 07:01:16
【问题描述】:

我正在尝试在启动期间设置 docker 容器主机名(HOSTNAME env var),这是在 dockerfile 的 ENTRYPOINT 中指定的 .sh 脚本:

#!/bin/sh
export HOSTNAME=something-$(hostname)
java $JAVA_OPTS  -jar /app.jar

我希望 jvm 可以看到这个新主机名。

我得到的只是像这样的标准 docker 主机名:

/ # env
HOSTNAME=04dbf311a3be

当我在容器启动后使用上面的导出手动设置主机名时,一切正常。一切都在使用 compose stackfile 以集群方式运行。

EDIT1: 我不是在容器构建期间而是在启动期间这样做

EDIT2: 说清楚,我有什么:

码头工人群:

CONTAINER1
HOSTNAME=391fa2c7e184
CONTAINER2
HOSTNAME=39123a43242asd4
CONTAINER3
HOSTNAME=123123123123

我想要什么:

CONTAINER1
HOSTNAME=APPNAME-391fa2c7e184
CONTAINER2
HOSTNAME=APPNAME-123fa2c7e184
CONTAINER3
HOSTNAME=APPNAME-343fa345e184

并希望在启动 n 容器时自动设置此设置

我如何尝试实现这一目标:

我尝试在容器启动时调用的 start.sh 文件中设置它(指向 dockerfile 中的 ENTRYPOINT 命令):

#!/bin/sh
export HOSTNAME=something-$(hostname)
java $JAVA_OPTS  -jar /app.jar

没有效果,HOSTNAME 没有被改变

【问题讨论】:

标签: java docker dockerfile hostname swarm


【解决方案1】:

我不认为入口点脚本是命名容器的正确位置,因为它已经在那时创建了。你有几种可能性。像这样在运行时命名。

~
$ docker run -it -h  myContainer 3bee3060bfc8 /bin/bash
[root@myContainer /]# echo $HOSTNAME
myContainer
[root@myContainer /]#

-h 选项可让您在运行容器时为其命名。 该值应该在您的 ENTRYPOINT 脚本中有效。

或者,如果您想更动态地创建容器名称,您应该在 docker compose 文件中命名它们。即使不使用 container_name 选项,docker-compose 也会追加 -1

version: '2'
services:
  myService:
    container_name: myService-$(envVariable)

我不知道 swarm,但由于它适用于 yaml 文件,因此您应该获得类似的命名选项。

【讨论】:

  • 我在 dockerfile entrypoint 命令中调用 run.sh 脚本。这个 sh 被放置在容器内。我希望为我提出的每个实例自动完成此操作。更重要的是 - 它必须从内部完成。
  • 不幸的是,这在 swarm 模式下不起作用: container_name 指定自定义容器名称,而不是生成的默认名称。 container_name: my-web-container 因为 Docker 容器名称必须是唯一的,所以如果您指定了自定义名称,则无法将服务扩展到 1 个容器之外。尝试这样做会导致错误。注意:当使用(版本 3)Compose 文件以 swarm 模式部署堆栈时,此选项将被忽略。
  • 需要明确的是,容器名称和容器的主机名是不同的东西。设置容器名不会改变主机名,设置容器的主机名不会改变容器名。 docker service create 接口也有 --hostname 与 docker service run 上的 --hostname 选项相同。
猜你喜欢
  • 2019-08-26
  • 1970-01-01
  • 2022-06-15
  • 1970-01-01
  • 1970-01-01
  • 2023-04-07
  • 2016-09-11
  • 1970-01-01
  • 2016-06-20
相关资源
最近更新 更多