Docker从命令或文件中设置环境变量
我需要设置一个环境变量Docker从命令或文件中设置环境变量,docker,environment-variables,Docker,Environment Variables,我需要设置一个环境变量CLASSPATH。在该变量中,我需要设置命令的结果: hadoop classpath --glob 这将返回大量java库,它们都需要设置为CLASSPATH变量。最大的问题是,我只能在docker构建完成后运行此命令,这意味着我必须在入口点中执行此操作。但我就是不能让它工作。我尝试了不同的方法: ENTRYPOINT ["sh", "-c", "export CLASSPATH=$(hadoop classpath --glob) ...." ENTRYPOINT
CLASSPATH
。在该变量中,我需要设置命令的结果:
hadoop classpath --glob
这将返回大量java库,它们都需要设置为CLASSPATH
变量。最大的问题是,我只能在docker构建完成后运行此命令,这意味着我必须在入口点中执行此操作。但我就是不能让它工作。我尝试了不同的方法:
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)
,在这种情况下,我更喜欢使用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
以基于
运行容器
$ 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"]
该问题的唯一有效解决方案是根本不在Dockerfile
中使用入口点
创建entrypoint.sh
将您需要的所有内容(例如导出)添加到该sh文件中
将dockerfile中的entrypoint.sh复制到/
docker run或dockercompose中的Execut entrypoint.sh
注意:您需要通过执行它/entrypoint.sh
。否则就不行了。谢谢你的回答,但这行不通。我不能运行echo“export NAME=TARUNLAWANI”>~/.profile
因为当我用我真正需要的东西替换你的名字时,我会得到一个错误,因为此时hadoop还没有启动。您只能在生成所有内容后运行此命令。然后在Dockerfile中的最后一个命令更改shell我不明白更改shell会有什么帮助。在日志文件中,您最后添加的应答语句被声明为“成功”但是,当我在容器中运行printenv
时,在它启动后没有CLASSPATH
设置。