Назад | Перейти на главную страницу

Изменить имя запущенного контейнера с хостом Ubuntu 16.04.4 LTS

Мой хозяин:

» lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description:    Ubuntu 16.04.4 LTS
Release:    16.04
Codename:   xenial

Мой докер:

» docker --version 
Docker version 17.05.0-ce, build 89658be

Что пробовал:

1) Установка имени хоста в контейнере: не удается, потому что у контейнера отсутствуют нужные возможности

root@172:/# hostname something
hostname: you must be root to change the host name

2) Редактирование вручную /etc/hostname в контейнере: не действует после перезапуска контейнера и не имеет смысла без перезапуска.

3) Ручное редактирование конфигурации контейнера: не работает, не знаю почему.

sudo vi /var/lib/docker/containers/834787a141d73b359814055b5fc0ba3e1cc52effeb6f916e2adece297d600772/config.v2.json

4) Изменение имени хоста контейнера на хосте с помощью инструментов пространств имен, как описано Вот: невозможно в Ubuntu 16.04.4 LTS поскольку у меня нет доступа к инструментам пространств имен.

Какие еще у меня есть варианты?

Обоснование

GitLab, похоже, передает свое текущее имя хоста бегуну GitLab, чтобы он мог клонировать репозитории. В сети по умолчанию к контейнеру нельзя попасть по имени, только по IP-адресу. Это означает, что мне нужно установить имя хоста контейнера gitlab на IP-адрес, но у меня есть только IP-адрес, когда он уже запущен. Таким образом, единственное решение:

  1. Запускаем контейнер
  2. Узнать его IP-адрес
  3. Замените имя хоста IP-адресом
  4. Теперь gitlab и gitlab runner могут общаться друг с другом

Другой (чистый) вариант - запустить контейнеры (gitlab и gitlab-runner) в настраиваемой сети, чтобы к ним можно было получить доступ по реальному имени хоста, но в настоящее время у меня проблема в том, что контейнеры, запущенные бегуном gitlab, не может достичь требуемых контейнерных служб, созданных бегуном при использовании настраиваемых сетей.

Для упрощения обновления сделайте это на хост-машине докера. Используйте такие параметры с командами запуска докера.

-v ./hosts:/etc/hosts -v ./hostname:/etc/hostname

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

Неправильный ответ на вашу проблему, но ответ, который вы просите:

Вы можете установить имя хоста при создании контейнера с опцией, например:

docker run --hostname example.com image_name

Почему это неправильный ответ? Потому что вы должны обращаться с контейнером как со скотом, а не с именем домашнего животного. Настройте gitlab и бегун, чтобы они использовали имя службы, если вы запускаете свои контейнеры в виде стека роя или с помощью docker compose. Или если вы запускаете контейнеры с docker run, вы можете использовать имя контейнера, хотя я бы рекомендовал как можно скорее переключиться на службу, чтобы упростить обновление.


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

docker run --cap-add SYS_ADMIN ...