将变量 "aaa.bbb" 传递到 Docker 容器进程
Passing Variable "aaa.bbb" into a Docker Container Process
更新:问题最初假定此问题与 Apache Commons Config 行为有关。我已经更新了问题和标题以缩小问题的焦点。
我正在使用以下 Apache 公共配置设置。此设置允许系统属性 and/or 环境变量覆盖配置文件属性。
我有许多配置文件属性,其值类似于 "dspace.url"。
在 Docker 中测试此应用程序时,通过将环境变量传递给容器来覆盖这些值会非常方便。
请注意,环境变量名称中的句点很难从命令行设置。以下命令失败。
export dspace.url=/some/path
但是,变量可以设置为docker 运行。
docker run -e dspace.url=/some/path ...
如果我连接到我的 Docker 实例,我会看到环境变量存在。
docker exec myapp /bin/bash
由此 shell 以下命令显示变量已设置。
env |grep "dspace.url"
这是我遇到的问题。当我尝试在较大的应用程序中覆盖此类值时,配置会加载我的大部分环境变量,但不会加载名称中包含句点的环境变量。
我试图通过编写以下程序来隔离问题。当我 运行 这个程序作为一个独立的应用程序时,我能够访问环境变量,例如 "dspace.url"。最值得注意的是,System.getenv() returns 这些值。
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();
}
}
如果我 运行 在我的大型应用程序中编译相同的代码,我看不到包含句点的环境变量。
您能想到要检查的任何其他差异吗?
OS/Docker 图像的默认值 shell 决定了这些变量是否可以导出到子进程中。
传递变量到当前shell
当使用 docker 运行 传递环境变量时,可以将包含句点的环境变量传递给 current 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 - 注意变量 不存在
文件
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 - 注意变量 存在
文件
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=/
更新:问题最初假定此问题与 Apache Commons Config 行为有关。我已经更新了问题和标题以缩小问题的焦点。
我正在使用以下 Apache 公共配置设置。此设置允许系统属性 and/or 环境变量覆盖配置文件属性。 我有许多配置文件属性,其值类似于 "dspace.url"。
在 Docker 中测试此应用程序时,通过将环境变量传递给容器来覆盖这些值会非常方便。
请注意,环境变量名称中的句点很难从命令行设置。以下命令失败。
export dspace.url=/some/path
但是,变量可以设置为docker 运行。
docker run -e dspace.url=/some/path ...
如果我连接到我的 Docker 实例,我会看到环境变量存在。
docker exec myapp /bin/bash
由此 shell 以下命令显示变量已设置。
env |grep "dspace.url"
这是我遇到的问题。当我尝试在较大的应用程序中覆盖此类值时,配置会加载我的大部分环境变量,但不会加载名称中包含句点的环境变量。
我试图通过编写以下程序来隔离问题。当我 运行 这个程序作为一个独立的应用程序时,我能够访问环境变量,例如 "dspace.url"。最值得注意的是,System.getenv() returns 这些值。
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();
}
}
如果我 运行 在我的大型应用程序中编译相同的代码,我看不到包含句点的环境变量。
您能想到要检查的任何其他差异吗?
OS/Docker 图像的默认值 shell 决定了这些变量是否可以导出到子进程中。
传递变量到当前shell
当使用 docker 运行 传递环境变量时,可以将包含句点的环境变量传递给 current 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 - 注意变量 不存在
文件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 - 注意变量 存在
文件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=/