Установка значений при сборке образа для контейнера Docker

Допустим, я вошел в свою Fedora как reynierpm и создам образ Docker из Dockerfile. Это изображение будет содержать среду LAMP. У меня есть файл Apache Virtual Host (VH) по умолчанию, который выглядит следующим образом:

<VirtualHost *:80>
    #ServerName www.example.com

    ServerAdmin webmaster@localhost
    DocumentRoot /var/www

    <Directory /var/www>
        AllowOverride All
        Require all granted
    </Directory>

    ErrorLog /dev/stdout
    CustomLog /dev/stdout combined
</VirtualHost>

В рамках процесса сборки этот файл копируется в нужное место на образе.

Могу ли я получить имя пользователя, вошедшего в систему, с хоста и динамически установить его в этом VH? В итоге хотелось бы получить следующий результат:

<VirtualHost *:80>
    ServerName reynierpm.dev

    ServerAdmin webmaster@localhost
    DocumentRoot /var/www

    <Directory /var/www>
        AllowOverride All
        Require all granted
    </Directory>

    ErrorLog /dev/stdout
    CustomLog /dev/stdout combined
</VirtualHost>

Я знаю, что могу получить значение для текущего пользователя, используя $(whoami) из bash, но как я могу вставить/установить его в файл VH при сборке Docker?

Это содержимое Dockerfile:

FROM ubuntu:14.04.5
MAINTAINER Me <[email protected]>
ARG USER_NAME=unknown
VOLUME ["/var/www"]

RUN apt-get update && \
    DEBIAN_FRONTEND=noninteractive \
    apt-get install -y software-properties-common && \
    apt-get update && \
    apt-get install -y \
      apache2 \
      php5 \
      php5-cli \
      libapache2-mod-php5 \
      php5-gd \
      php5-json \
      php5-mcrypt \
      php5-mysql \
      php5-xdebug \
      php5-curl \
      php5-memcached \
      php5-mongo \
      zend-framework \
      mc \
      nano

# Copy default virtual host file.
COPY /config/apache2_vhost/apache_default /etc/apache2/sites-available/000-default.conf
COPY run /usr/local/bin/run
RUN chmod +x /usr/local/bin/run
RUN a2enmod rewrite

EXPOSE 80
EXPOSE 9001

CMD ["/usr/local/bin/run"]

ОБНОВЛЕНИЕ: сборка завершается ошибкой при попытке использовать аргументы

Следуя предложению @Elton, я добавил эту строку в файл run:

sed -i "s/#ServerName www.example.com/$USER_NAME.dev/g" /etc/apache2/sites-available/000-default.conf

А затем попробуйте построить образ как:

docker build --build-arg USER_NAME=$(whoami) -t dev-php55 .

Но не работает со следующим сообщением:

Один или несколько аргументов сборки [USER_NAME] не были использованы, сборка завершилась неудачно.

Что не так?


person ReynierPM    schedule 22.09.2016    source источник


Ответы (1)


Если вы хотите, чтобы это значение было зафиксировано в образе, лучше всего использовать аргумент сборки и выполнить некоторую замену текста в вашем Dockerfile:

FROM ubuntu                                                                                                                                          
ARG USER_NAME=unknown                                                                                                                                
RUN echo Built by: $USER_NAME > /builder.txt

Затем передайте свой whoami при сборке:

docker build --build-arg USER_NAME=$(whoami) -t temp .

Аргумент сборки переопределяет значение по умолчанию в Dockerfile, поэтому ваш образ имеет настоящее имя пользователя сборщика:

docker run temp cat /builder.txt                                                                                                                   
Built by: ubuntu 

EDIT: аргументы сборки доступны только как переменные окружения в процессе сборки. Ни переменная, ни значение не присутствуют в окончательном построенном образе. Таким образом, вы можете использовать значение аргумента только в инструкциях по сборке, таких как RUN.

person Elton Stoneman    schedule 22.09.2016
comment
Можешь взглянуть на мою правку? Может быть, я что-то упускаю - person ReynierPM; 22.09.2016
comment
Эта ошибка означает, что имя аргумента в --build-arg не соответствует имени в ARG. - person Elton Stoneman; 22.09.2016
comment
Хорошо, но это не то, чего я хочу достичь. Вы понимаете основную проблему, которая у меня возникла? Посмотрите на OP, может быть, сейчас лучше - person ReynierPM; 22.09.2016
comment
Если вы хотите динамически помещать информацию о хосте в изображение, то я не думаю, что это возможно. Каждая инструкция в Dockerfile выполняется во временном промежуточном контейнере, а контейнеры ничего не знают о хосте. Если вы хотите, чтобы сведения о хосте попали во временные контейнеры в сборке, вам нужно передать их с помощью аргументов сборки. - person Elton Stoneman; 22.09.2016
comment
Значит, я не могу передать аргумент USER_NAME в файл run? Это то, что ты сказал? Если это невозможно, и мне это все еще нужно, какой-нибудь обходной путь? - person ReynierPM; 22.09.2016
comment
Не в файле run, нет. Аргументы сборки доступны только во время сборки, а не в построенном образе. Вместо этого вы можете использовать ENV или переместить sed в инструкцию RUN в Dockerfile. - person Elton Stoneman; 22.09.2016
comment
Можете ли вы улучшить свой ответ, отразив этот последний комментарий с примером каждого из них? Я новичок в Docker, поэтому я все еще учусь - person ReynierPM; 22.09.2016
comment
Мне интересно знать, как добиться этого, используя ENV добавить RUN в Dockerfile для команды seed было бы легко - person ReynierPM; 22.09.2016
comment
В ответе на ARG и ENV. 39598751#39598751">этот вопрос - person Elton Stoneman; 22.09.2016