2017-09-15 141 views
2

我需要设置一个环境变量CLASSPATH。在该变量,我需要设置一个命令的结果:Docker从命令或文件设置环境变量

hadoop classpath --glob 

这将返回一吨的Java库,他们都需要进行设定成CLASSPATH变量。最大的问题是我只能在Docker构建完成后才能运行此命令,这意味着我必须在ENTRYPOINT中执行此操作。但我不能让它工作。我尝试了不同的方法:

ENTRYPOINT ["sh", "-c", "export CLASSPATH=$(hadoop classpath --glob) ...." 
ENTRYPOINT ["sh", "-c", "set CLASSPATH=$(hadoop classpath --glob) ...." 
ENTRYPOINT ["sh", "-c", "CLASSPATH=$(hadoop classpath --glob) ...." 
ENTRYPOINT ["sh", "-c", "/bin/bash && export CLASSPATH=$(hadoop classpath --glob) ...." 

但是没有任何工作。该命令本身正在工作,我使用它进行了测试:

ENTRYPOINT ["sh", "-c", "echo $(hadoop classpath --glob) >> /tmp/classpath.tmp ...." 

此文件包含启动后的正确内容。因此,设置和维持环境变量只是一个问题。我应该如何设置环境变量?通常你使用类似

ENV CLASSPATH="some classpath" 

但在这里我不能使用ENV声明,因为它不会处理命令$(hadoop classpath --glob)

回答

0

该问题的唯一工作解决方案是t o根本不在Dockerfile中使用ENTRYPOINT

  1. 创建entrypoint.sh
  2. 添加你需要的泊坞窗运行(例如出口)到该SH文件
  3. 复制entrypoint.sh在dockerfile到/
  4. EXECUT entrypoint.sh东西或dockercompose

注意:您需要执行. /entrypoint.sh。否则它不会工作。

1

在这种情况下,我宁愿使用bash的轮廓变化SHELLsh -lc而不是sh -c

Dockerfile

FROM alpine 
RUN echo "export NAME=TARUNLALWANI" >> ~/.profile 
RUN echo $NAME 
SHELL ["sh", "-lc"] 
RUN echo $NAME 
CMD env 

输出构建

$ docker build . --no-cache 
Step 1/6 : FROM alpine 
Step 2/6 : RUN echo "export NAME=TARUNLALWANI" >> ~/.profile 
Step 3/6 : RUN echo $NAME 

Step 4/6 : SHELL sh -lc 
Removing intermediate container a6a243f24519 
Step 5/6 : RUN echo $NAME 
TARUNLALWANI 
Successfully built 054f35a4d89a 

正如你可以看到sh -csh -lc开始加载我们的形象改变壳的。所以,你会更新.profile出口基于

CLASSPATH运行容器

$ docker run 054f35a4d89a 
HOSTNAME=92c4ca32b1f0 
SHLVL=1 
HOME=/root 
PAGER=less 
PS1=\h:\w\$ 
NAME=TARUNLALWANI 
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin 
PWD=/ 
CHARSET=UTF-8 

编辑-1

试试这个,而无需配置文件的

ENTRYPOINT [] 
CMD ["/bin/sh", "-c", "export CLASSPATH=$(hadoop classpath --glob) && env"] 
+0

感谢您的回答,但这不会工作。我不能做'运行回声'导出NAME = TARUNLAWANI“>>〜/ .profile',因为当我用我真正需要的东西替换你的名字时'hadoop classpath --glob'我会得到一个错误,因为此时hadoop没有启动然而。只有在构建完成之后,才能运行此命令。 – Mulgard

+0

然后在Dockerfile的最后一条命令中更改shell –

+0

我不明白它应该如何帮助更改shell。 – Mulgard