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
    设置。