
Мой хозяин:
» 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 runner для клонирования репозиториев. В сети по умолчанию контейнер не может быть доступен по имени, только по IP-адресу. Это означает, что мне нужно установить имя хоста контейнера gitlab на IP-адрес, но у меня есть только IP-адрес, когда он уже запущен. Таким образом, единственным решением является:
- Запустить контейнер
- Узнайте его IP-адрес
- Замените имя хоста IP-адресом.
- Теперь gitlab и gitlab runner могут общаться друг с другом
Другим (чистым) вариантом был бы запуск контейнеров (gitlab и gitlab-runner) в пользовательской сети, чтобы к ним можно было получить доступ по реальному имени хоста, но в настоящее время у меня возникла проблема, заключающаяся в том, что контейнеры, запущенные gitlab runner, не могут получить доступ к требуемым службам контейнеров, созданным runner, при использовании пользовательских сетей.
решение1
Неправильный ответ на ваш вопрос, но ответ, который вы просите:
Вы можете задать имя хоста при создании контейнера с помощью опции, например:
docker run --hostname example.com image_name
Почему это неправильный ответ? Потому что вы должны обращаться с контейнером как со скотом, а не как с именованным питомцем. Настройте gitlab и runner так, чтобы они использовали имя сервиса, если вы запускаете свои контейнеры как swarm-стек или с помощью docker compose. Или, если вы запускаете контейнеры с помощью docker run
, вы можете использовать имя контейнера, хотя я бы рекомендовал переключиться на сервис как можно скорее, чтобы упростить обновления.
Для еще худшего решения вышесказанного, вы можете добавить возможности контейнеру, чтобы позволить ему изменять свое собственное имя хоста изнутри контейнера. Это создает уязвимости безопасности и не рекомендуется для любой среды, где безопасность важна:
docker run --cap-add SYS_ADMIN ...
решение2
Для простоты обновления сделайте это на хост-машине docker. Используйте такие опции с командами docker run.
-v ./hosts:/etc/hosts -v ./hostname:/etc/hostname
Вы сможете обновить файл на хост-машине, не заходя внутрь контейнера и не обновляя файл.