Как я могу сделать /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"
Использованная литература:
Как я могу добавить имена хостов в контейнер в той же сети докеров?