Как я могу сделать /etc/hosts доступным для записи пользователем root в контейнере Docker?

Я новичок в использовании Docker и настраиваю контейнер.
Я не могу отредактировать /etc/hosts (но мне нужно для какого-то программного обеспечения, которое я разрабатываю). Автоматическое редактирование (через sudo или root) файла говорит о том, что он находится в файловой системе только для чтения. Ручное (vim) редактирование файла говорит о том, что он доступен только для чтения, и я не могу сохранить изменения как root (права доступа для rw для владельца (root)).

Однако я могу изменить другие файлы и добавить файлы в /etc.

Есть ли какая-то причина для этого?

Могу ли я изменить конфигурацию Docker, чтобы разрешить редактирование /etc/hosts?

Спасибо

5 ответов

ОБНОВЛЕНИЕ 2014-09

Смотрите ответ @Thomas:

/ etc / hosts теперь доступен для записи в Docker 1.2.

Оригинальный ответ

Вы можете использовать этот хак в то же время

https://unix.stackexchange.com/questions/57459/how-can-i-override-the-etc-hosts-file-at-user-level

В вашем Dockerfile:


ADD your_hosts_file /tmp/hosts
RUN mkdir -p -- /lib-override && cp /lib/x86_64-linux-gnu/libnss_files.so.2 /lib-override
RUN perl -pi -e 's:/etc/hosts:/tmp/hosts:g' /lib-override/libnss_files.so.2
ENV LD_LIBRARY_PATH /lib-override

/etc/hosts теперь доступно для записи с Docker 1.2.

Из блога Докера:

Обратите внимание, однако, что изменения в этих файлах не сохраняются во время сборки Docker и поэтому не будут сохранены в результирующем образе. Изменения будут "залипать" только в работающем контейнере.

В настоящее время это техническое ограничение Docker, которое обсуждается далее по адресу https://github.com/dotcloud/docker/issues/2267.

Это в конечном итоге будет отменено.

На данный момент вам нужно обойти это, например, с помощью пользовательского dnsmasq сервер.

Недавно я столкнулся с необходимостью добавить запись в /etc/hosts файл (для того, чтобы сделать sendmail за работой).

Я закончил тем, что сделал это частью Dockerfile"s CMD объявление как это:

CMD echo "127.0.0.1 noreply.example.com $(hostname)" >> /etc/hosts \
    && sendmailconfig \
    && cron -f

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

Вы можете сделать это без изменения файла /etc/hosts. Просто добавьте extra_hosts в свой файл docker-compose.yml, как показано ниже:

      myapp:
  image: docker.io/bitnami/laravel:9
ports:
  - 80:8080
extra_hosts:
  - "myapp.test:0.0.0.0"
  - "subdomain.myapp.test:0.0.0.0"

Использованная литература:

Как я могу добавить имена хостов в контейнер в той же сети докеров?

Другие вопросы по тегам