Docker从命令或文件设置环境variables

我需要设置一个环境variablesCLASSPATH 。 在这个variables中,我需要设置一个命令的结果:

 hadoop classpath --glob 

这将返回大量的Java库,他们都需要设置到该CLASSPATHvariables。 最大的问题是我只能在ENTRYPOINT构build完成后才能运行这个命令,这意味着我必须在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) ...." 

但没有任何工作。 该命令本身正在工作,我testing它使用:

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

该文件包含启动后的正确内容。 所以设置和维护环境variables只是一个问题。 我应该如何设置环境variables? 通常你使用类似的东西

 ENV CLASSPATH="some classpath" 

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

在这种情况下,我宁愿使用bashconfiguration文件将SHELL更改为sh -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 

正如您所看到的,将SHELL从sh -c更改为sh -lc开始加载我们的configuration文件。 所以你会更新.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

尝试这个,而不需要一个configuration文件

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

这个问题唯一的解决方法是根本不在ENTRYPOINT中使用Dockerfile

  1. 创buildentrypoint.sh
  2. 将所有需要的东西(例如导出)添加到该sh文件中
  3. 将dockerfile中的entrypoint.sh复制到/
  4. 在docker运行或dockercompose中执行entrypoint.sh

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