Как я могу сделать /etc/hosts доступными для записи root в контейнере Docker?
Я новичок в использовании докеров и настраиваю контейнер.
Я не могу редактировать /etc/hosts (но мне нужно какое-то программное обеспечение, которое я разрабатываю). Автоматическое редактирование (через sudo или root) файла указывает его на файловую систему только для чтения. Ручное (vim) редактирование файла говорит о его только для чтения, и я не могу сохранить изменения с правами root (разрешения для файлов - rw для владельца (root)).
Однако я могу изменить другие файлы и добавить файлы в /etc.
Есть ли причина для этого?
Можно ли изменить конфигурацию Docker, чтобы разрешить редактирование /etc/hosts?
спасибо
Ответы
Ответ 1
ОБНОВЛЕНИЕ 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
В вашем файле Docker:
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
Ответ 2
/etc/hosts
теперь доступен для записи с Docker 1.2.
Из блога Docker:
Обратите внимание, что изменения этих файлов не сохраняются во время docker build и поэтому не будет сохранено в полученном изображении. изменения будут только "вставляться" в запущенный контейнер.
Ответ 3
В настоящее время это техническое ограничение Docker, и далее рассматривается в https://github.com/dotcloud/docker/issues/2267.
В конечном итоге он будет снят.
Теперь вам нужно обойти это, например. используя пользовательский dnsmasq
сервер.
Ответ 4
Я недавно наткнулся на необходимость добавить запись в файл /etc/hosts
(чтобы сделать работу sendmail
).
В итоге я стал частью объявления Dockerfile
CMD
следующим образом:
CMD echo "127.0.0.1 noreply.example.com $(hostname)" >> /etc/hosts \
&& sendmailconfig \
&& cron -f
Таким образом, он фактически не является частью изображения, но он всегда доступен после создания контейнера из изображения.