【问题标题】:Passing Variable "aaa.bbb" into a Docker Container Process将变量“aaa.bbb”传递给 Docker 容器进程
【发布时间】:2019-06-29 22:20:20
【问题描述】:

更新:问题最初假设此问题与 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

在该 shell 中,以下命令显示变量已设置。

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

如果我运行在我的较大应用程序中编译的相同代码,我看不到包含句点的环境变量。

你能想出其他需要检查的差异吗?

【问题讨论】:

    标签: docker environment-variables apache-commons apache-commons-config


    【解决方案1】:

    OS/Docker 映像的默认 shell 决定这些变量是否可以导出到子进程中。

    将变量传递给当前shell

    使用 docker run 传递环境变量时,可以将包含句点的环境变量传递给当前 shell

    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
    

    高山

    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=/
    
    猜你喜欢
    • 2015-09-18
    • 2022-01-16
    • 2021-06-07
    • 2020-02-23
    • 1970-01-01
    • 1970-01-01
    • 2015-08-10
    • 2016-12-08
    • 2021-06-25
    相关资源
    最近更新 更多