Передача переменной aaa.bbb в процесс контейнера Docker

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

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

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

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

export dspace.url=/some/path

Однако эту переменную можно установить с помощью docker run.

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();
    }
}

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

Можете ли вы придумать какие-либо другие различия для изучения?


person terrywb    schedule 06.02.2019    source источник


Ответы (1)


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

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

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

убунту

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

альпийский

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`
Output
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`
Output
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=/
person terrywb    schedule 07.02.2019
comment
stackoverflow.com/questions/29753126/ - person terrywb; 12.03.2019
comment
superuser.com/questions/495991/ - person terrywb; 12.03.2019