Docker / Compose: определить и использовать переменную env - PullRequest
0 голосов
/ 02 февраля 2019

на моем github я создаю небольшой форк из образа минимального докера debian. На самом деле это 5 пакетов, которые основаны на предыдущем:

debian-base-minimal
debian-base-standard
debian-base-security
debian-base-apache
debian-base-apache-php

На debian-base-apache Я хочу получить рабочую переменную env, которую я могу определить позже в файле docker-compose.Что должен сделать env?

В случае определения через docker-compose следует написать ServerName $SERVER_NAME в конце /etc/apache2/apache2.conf, чтобы задать глобальное имя сервера.Если пусто, новая строка не должна быть написана.

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

Я уже пробовал что-то вроде: echo "ServerName $SERVER_NAME" >> /etc/apache2/apache2.conf

на моем 040-debian-base-apache файл.Но при сборке он написал ServerName в, потому что я не определил значение и его использование null.Если я установил значение по умолчанию в Dockerfile (ENV SERVER_NAME=127.0.0.1), то создайте образ с помощью 127.0.0.1, и я не могу изменить 127.0.0.1 через переменную, предупредите переменную, уже заполненную значением. см. Здесь на GitHub с отмеченной линией

Я строю все вещи с помощью следующего файла.

По выходу здания с определенным ENV SERVER_NAME=127.0.0.1 в Dockerfile (на самом деле не в репо):

[...]
+ echo 'ServerName 127.0.0.1'
+ /etc/init.d/apache2 stop
Stopping Apache httpd web server: apache2.
ok.
+ /etc/init.d/apache2 start
Starting Apache httpd web server: apache2.
ok.
[...]

Было бы хорошо, если бы по умолчанию стоял 127.0.0.1 cauz, который может запустить apache.Но я не могу определить его сейчас в docker-compose.yml, так как он жестко закодирован как 127.0.0.1, а не как вывод переменной.

При выходе из здания без определенного ENV в Dockerfile (фактически версия репо):

[...]
+ echo 'ServerName '
+ /etc/init.d/apache2 stop
Stopping Apache httpd web server: apache2.
+ /etc/init.d/apache2 start
Starting Apache httpd web server: apache2 failed!
The apache2 configtest failed. ... (warning).
Output of config test was:
AH00526: Syntax error on line 228 of /etc/apache2/apache2.conf:
ServerName takes one argument, The hostname and port of the server 
[...]

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

Большое спасибо заранее.

1 Ответ

0 голосов
/ 02 февраля 2019

Как вы заметили, каждая команда RUN в Dockerfile происходит в docker build время, и, в частности, содержимое файла будет фиксироваться в зависимости от того, какая переменная среды была при запуске сборки.Вы хотите, чтобы оно изменялось в зависимости от значения переменной среды выполнения, а это значит, что для этого нужно написать скрипт, который запускается при запуске.

Типичным подходом является написание скрипта ENTRYPOINT, который выполняет первыйустановка времениENTRYPOINT получает CMD (или любую другую команду, переданную в docker run) в качестве аргументов командной строки, поэтому, если она заканчивается на exec "$@", последнее, что она делает, - запускает «обычную» команду.Здесь вы можете использовать любую обычную логику сценария оболочки, поэтому я могу написать

#!/bin/sh
if [ -n "$SERVER_NAME" ]; then
  echo "ServerName $SERVER_NAME" >> /etc/apache2/apache2.conf
fi
exec "$@"

Затем вы можете указать это в вашем Dockerfile

COPY entrypoint.sh /
RUN chmod +x /entrypoint.sh
ENTRYPOINT ["/entrypoint.sh"]
CMD ["apachectl", "-DFOREGROUND"]

(chmod не требуется, есливы можете гарантировать, что у файла есть права на выполнение на вашем хосте, отличном от Windows. ENTRYPOINT должен использовать форму JSON-ish. Если у вас есть другое изображение, построенное поверх него, помните, что объединенное изображение получает только одну ENTRYPOINT и однуCMD; очень глубокая стопка изображений, которую вы предлагаете, довольно необычная установка.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...