Передача переменной "aaa.bbb" в процесс контейнера Docker - PullRequest
0 голосов
/ 06 февраля 2019

Обновление: изначально предполагалось, что эта проблема связана с поведением Apache Commons Config.Я обновил вопрос и название, чтобы сузить фокус вопроса.

Я работаю со следующей настройкой конфигурации Apache commons.Эта настройка позволяет системным свойствам и / или переменным среды переопределять свойства файла конфигурации.У меня есть ряд свойств файла конфигурации со значениями, такими как "dspace.url".

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

Обратите внимание, что период в имени переменной среды трудно установить из командной строки.Сбой следующей команды.

export dspace.url=/some/path

Однако переменная может быть установлена ​​при запуске Docker.

docker run -e dspace.url=/some/path ...

Если я подключаюсь к своему экземпляру Docker, я вижу, что переменная среды присутствует.

docker exec myapp /bin/bash

Из этой оболочки следующая команда показывает, что переменная установлена.

env |grep "dspace.url"

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

Я попытался изолировать проблемунаписав следующую программу.Когда я запускаю эту программу как отдельное приложение, я могу получить доступ к переменным среды, таким как «dspace.url».В частности, System.getenv () возвращает эти значения.

public static void main(String[] args) {
    //builder.setFile(new File("config.xml"));
    try {
        DefaultConfigurationBuilder builder = new DefaultConfigurationBuilder("config-definition.xml");
        Configuration config = builder.getConfiguration(true);
        for(Iterator<String> keys = config.getKeys(); keys.hasNext(); ) {
            System.out.println("TBTB1 "+keys.next());
        }

        System.out.println("");

        for(Iterator<String> keys=new EnvironmentConfiguration().getKeys(); keys.hasNext();) {
            System.out.println("TBTB2 "+keys.next());
        }

        System.out.println("");

        for(String s: System.getenv().keySet()) {
            System.out.println("TBTB3"+s);
        }

        System.out.println(config.getString("dspace.foo"));
        System.out.println(config.getString("dspace.name"));
    } catch (ConfigurationException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}

Если я запускаю этот же код, скомпилированный в моем более крупном приложении, я не вижу переменных среды, содержащих точки.

МожетВы думаете о каких-либо других различиях, чтобы исследовать?

1 Ответ

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

Оболочка по умолчанию для образа OS / Docker определяет, могут ли эти переменные быть экспортированы в дочерние процессы.

передача переменных в текущую оболочку

При передаче переменной среды с запуском Docker,можно передать переменную окружения, содержащую точку, в текущую оболочку .

ubuntu

winpty docker run --rm -it -e dspace.foo=ZZZZZ ubuntu env
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
HOSTNAME=0f34eac98005
TERM=xterm
dspace.foo=ZZZZZ
HOME=/root

alpine

docker run --rm -it -e dspace.foo=ZZZZZ alpine env
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
HOSTNAME=2887c4ed82ce
TERM=xterm
dspace.foo=ZZZZZ
HOME=/root

доступ к переменнойиз подпроцесса

ubuntu - обратите внимание, что переменная отсутствует

Dockerfile
FROM ubuntu
CMD echo `env`
Вывод
docker run --rm -it -e dspace.foo=ZZZZZ myshell
HOSTNAME=143368c4bdde HOME=/root TERM=xterm PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin PWD=/

alpine - обратите внимание, что переменная присутствует

Dockerfile
FROM alpine
CMD echo `env`
Вывод
docker run --rm -it -e dspace.foo=ZZZZZ myshell
HOSTNAME=323a8540cefa SHLVL=1 HOME=/root TERM=xterm dspace.foo=ZZZZZ PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin PWD=/
...