Невозможно записать файл / etc / hosts из Dockerfile с помощью RUN

9

Я делаю образ докера, используя довольно простой Dockerfile. Внутри Dockerfile у меня есть эта команда:

RUN printf "192.92.13.243 www.hahaha.com \n" >> /etc/hosts

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

Проблема заключается в следующем: при запуске образа строка, которая должна быть вставлена ​​в «/ etc / hosts», отсутствует.

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

Я что-то пропустил?

ОБНОВЛЕНИЕ 1:

Похоже, что на страницах докера github есть много проблем, как открытых, так и закрытых.

dlyk1988
источник

Ответы:

12

Это работает на Docker 1.7.0

RUN echo "192.168.11.112 myhost" >> /etc/hosts && wget http://myhost

Хитрость заключается в том, чтобы добавить имя хоста в той же строке, в которой вы его используете, в противном случае файл hosts будет сброшен, поскольку каждая команда RUN запускает новый промежуточный контейнер. Например, это не будет работать :

RUN echo "192.168.11.112 myhost" >> /etc/hosts
RUN wget http://myhost
Йонатан
источник
1
Спасибо за понимание! Хотя это правильно (я проверил) и в целом полезно, в данном случае оно мне бесполезно. Мне нужно, чтобы файл "hosts" заполнялся при запуске контейнера.
dlyk1988
2
+1 для запуска команд на одной линии
myol
7

После написания обновления на мой вопрос я решил еще раз внимательно взглянуть на «проблемы», открытые в github. Оказывается, обходной путь был реализован:

docker run ... --add-host='server:0.0.0.0' ...

Используя аргумент "--add-host ..." при запуске контейнера, можно изменить файл hosts.

dlyk1988
источник
5
Я хочу быть в состоянии сделать это в сборке, хотя. Человек, управляющий контейнером, не должен знать о внутренних хостах. Не имеет смысла!
samsamm777
Я эхом @ samsamm777. Интересно, есть ли хороший способ сделать это?
Джонатан
Это действительно очень удивительное поведение, которое никогда не было хорошей идеей в ИТ-системах.
Торстен Бронджер