Как прозрачно запустить скрипт перед точкой входа в докер? - PullRequest
0 голосов
/ 19 июня 2019

Я автоматизирую развертывание Java-приложения в Docker-контейнере в шаблонах облачной информации.Мне нужно настроить переменную env для журналов сбоев java, но мне нужно сохранить уникальный путь для каждого контейнера.Я не могу изменить образ докера или файл докера.

Для этого я использую $ HOSTNAME из контейнера докера, который достаточно уникален.Проблема в том, что я не могу использовать ее как обычную переменную окружения docker, потому что она устанавливается после запуска контейнера.Обойти это можно, изменив точку входа, установив переменную env и запустив исходную точку входа после этого.

EntryPoint: 
            - /bin/sh
            - -c
            - export JAVA_OPTS="$JAVA_OPTS -XX:HeapDumpPath=/mnt/crashdumps/java_$HOSTNAME.hprof" 
&& ./entrypoint.sh

(это шаблон YAML с облачной информацией для AWS :: ECS :: TaskDefinition, но может быть то же самоевыражается в docker cli)

Это работало нормально, пока поставщик контейнера java не изменил размещение сценария оболочки точки входа.Теперь инъекция оболочки выглядит действительно грязно в коде, потому что мне нужно проверить, существует ли файл и требует ли он дополнительного обслуживания (т. Е. В случае, если путь к точке входа или имя файла будут снова изменены).

Isесть лучший способ:

  1. динамически настроить путь с именем контейнера, используя метод, отличный от точки входа модификации;или
  2. внедрить просто команду «export» и запустить исходную точку входа, независимо от имени и пути?

1 Ответ

0 голосов
/ 19 июня 2019

Если вам нужен динамически сгенерированный путь для ваших журналов сбоев java, я бы предложил динамически сгенерировать уникальное имя в самом скрипте точки входа docker.

Как этот, который я тестировал и отлично работает.

#!/bin/sh

# Create some random file in /tmp
filename=$(head /dev/urandom | tr -dc A-Za-z0-9 | head -c 13 ; echo '')
touch /tmp/$filename
cat /tmp/$filename
export filename=$filename

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

$ ls /tmp/
DzJXInMvJAgvN  f0rgIMIt115h7  sSgVDXj2zvRTh  x4dBEciezQnix

Таким образом, в этом случае точка входа будет генерировать уникальное имя при каждом вызове, поэтому не будет необходимости вызывать что-либо до docker entrypoint.

Надеюсь, это поможет.

Обновление

Пока я понимаю, что вы хотите переопределить путь к файлу журналов сбоев Java, не редактируя dockerfile илисценарий входа.Опция -XX:HeapDumpPath, равная JAVA_OPTS, если я прав.

Вы можете попробовать это

$ docker run -itd --env JAVA_OPTS="$JAVA_OPTS -XX:HeapDumpPath=/mnt/crashdumps/java_$(head /dev/urandom | tr -dc A-Za-z0-9 | head -c 13 ; echo '').hprof" alpine sh
$ docker exec -it 75f062ff8906 env
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
HOSTNAME=75f062ff8906
TERM=xterm
JAVA_OPTS= -XX:HeapDumpPath=/mnt/crashdumps/java_MyRZcSKxFtZaF.hprof
HOME=/root

Как видите, JAVA_OPTS переопределяется с соответствующим именем файла.Надеюсь, это поможет, дайте мне знать.

...