Docker从命令或文件设置环境variables
我需要设置一个环境variablesCLASSPATH
。 在这个variables中,我需要设置一个命令的结果:
hadoop classpath --glob
这将返回大量的Java库,他们都需要设置到该CLASSPATH
variables。 最大的问题是我只能在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
。
- 创buildentrypoint.sh
- 将所有需要的东西(例如导出)添加到该sh文件中
- 将dockerfile中的entrypoint.sh复制到
/
- 在docker运行或dockercompose中执行entrypoint.sh
注意:你需要执行它. /entrypoint.sh
. /entrypoint.sh
。 否则,它不会工作。