Как создать файл свойств через Dockerfile с динамическими значениями, передаваемыми в Docker Run? - PullRequest
0 голосов
/ 29 января 2019

Я относительно новичок в Docker.Может быть, это глупый вопрос.

Моя цель - создать изображение с файлом system.properties, который, как следует из названия, является файлом свойств с парами ключ-значение.Я хочу заполнить значения в этом файле динамически .Поэтому я думаю, что значения должны быть переданы в качестве переменных среды в команду запуска Docker.

Например, если это то, что я хочу в моем файле system.properties:

buildMode=true
source=/path1

IЯ хочу предоставить значения для этого файла динамически, что-то вроде:

$ docker run -e BUILD_MODE=true -e SOURCE='/path1' my_image

Но я застрял в том, как я могу скопировать значения в файл.Мы будем благодарны за любую помощь.

Примечание : Базовое изображение - linux centos.

1 Ответ

0 голосов
/ 29 января 2019

Как вы подозреваете, вам нужно создать настоящий файл во время выполнения.Одна из полезных в Docker схем - это написание специального сценария точки входа, который выполняет все необходимые настройки, а затем запускает команду основного контейнера.

Если вы используете «большую» базу распространения Linux, envsubst - полезный инструмент для этого.(Он является частью набора инструментов GNU и по умолчанию недоступен для базовых образов Alpine, но в CentOS он должен быть.) Вы можете написать файл шаблона:

buildMode=${BUILD_MODE}
source=${SOURCE}

Затем вы можете скопировать этот шаблон вВаше изображение:

...
WORKDIR /app
COPY ...
COPY system.properties.tmpl ./
COPY entrypoint.sh /
ENTRYPOINT ["/entrypoint.sh"]
CMD ["java", "-jar", "app.jar"]

Сценарию точки входа необходимо запустить envsubst, а затем выполнить команду:

#!/bin/sh
envsubst <system.properties.tmpl >system.properties
exec "$@"

Подобные приемы можно выполнить, просто используя sed (1), который более универсален, но требует более хитрых регулярных выражений.

...