我需要设置一个环境变量CLASSPATH
。在该变量中,我需要设置命令的结果:
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 :(得分:1)
在这种情况下,我更倾向于使用bash配置文件将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
开始加载我们的个人资料。因此,您需要根据
.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"]
答案 1 :(得分:0)
解决该问题的唯一有效方法是不在ENTRYPOINT
中使用Dockerfile
。
/
注意:您需要. /entrypoint.sh
执行它。否则它不会工作。