Имя хоста контейнера Docker

Я пытаюсь установить имя хоста контейнера докеров (HOSTNAME env var) во время запуска, это скрипт .sh, указанный в ENTRYPOINT файла докеров:

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

Я хочу, чтобы это новое имя хоста было видно для jvm.

Все, что я получаю, это стандартное имя хоста докера:

/ # env
HOSTNAME=04dbf311a3be

Когда я устанавливаю имя хоста вручную, используя этот экспорт выше, после запуска контейнера все работает нормально. Все запускается в рое с использованием файла стека компоновки.

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, вызываемом при запуске контейнера (указано в команде ENTRYPOINT в файле докеров):

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

нет эффекта, HOSTNAME не изменяется


person madi    schedule 12.07.2017    source источник
comment
Возможный дубликат Как обрабатывать конкретное имя хоста, например параметр -h в Dockerfile   -  person worker_bee    schedule 12.07.2017
comment
Вовсе нет, я хочу сделать это после сборки - во время запуска   -  person madi    schedule 12.07.2017


Ответы (1)


Я не думаю, что сценарий точки входа является правильным местом для названия вашего контейнера, поскольку он уже создан в этот момент. У вас есть пара возможностей. Назовите его во время выполнения следующим образом.

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

Опция -h позволяет вам назвать свой контейнер при его запуске. Это значение должно быть действительным в вашем сценарии ENTRYPOINT.

Или, если вы хотите создавать имена своих контейнеров более динамично, вы должны назвать их в файле компоновки докеров. Даже если вы не используете параметр container_name, docker-compose добавит -1

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

Я не знаю swarm, но поскольку он работает с файлом yaml, вы должны получить аналогичные параметры именования.

person Mark Chassy    schedule 12.07.2017
comment
Я вызываю скрипт run.sh в команде точки входа dockerfile. Эта ш помещается внутрь контейнера. Я хочу, чтобы это делалось автоматически для каждого экземпляра, который я вызываю. Более того - это нужно делать изнутри. - person madi; 12.07.2017
comment
К сожалению, это не будет работать в режиме роя: container_name Укажите собственное имя контейнера, а не сгенерированное имя по умолчанию. container_name: my-web-container Поскольку имена контейнеров Docker должны быть уникальными, вы не можете масштабировать сервис за пределы 1 контейнера, если вы указали пользовательское имя. Попытка сделать это приводит к ошибке. Примечание. Этот параметр игнорируется при развертывании стека в режиме роя с файлом Compose (версия 3). - person madi; 12.07.2017
comment
Просто для ясности: имя контейнера и имя хоста контейнера — это разные вещи. Установка имени контейнера не изменит имя хоста, установка имени хоста контейнера не изменит имя контейнера. Интерфейс docker service create также имеет --hostname, который имеет паритет с опцией --hostname на docker service run. - person programmerq; 12.07.2017