Docker从命令或文件

时间:2017-09-15 11:29:25

标签: docker environment-variables

我需要设置一个环境变量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)

2 个答案:

答案 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

  1. 创建entrypoint.sh
  2. 将您需要的所有内容(例如导出)添加到该sh文件
  3. 将dockerfile中的entrypoint.sh复制到/
  4. 在docker run或dockercompose中执行entrypoint.sh
  5. 注意:您需要. /entrypoint.sh执行它。否则它不会工作。