Мой хозяин:
» 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-адрес, когда он уже запущен. Таким образом, единственное решение:
Другой (чистый) вариант - запустить контейнеры (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 ...