Mul*_*ard 7 environment-variables docker
我需要设置一个环境变量CLASSPATH
。在该变量中,我需要设置命令的结果:
hadoop classpath --glob
Run Code Online (Sandbox Code Playgroud)
这将返回大量的 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) ...."
Run Code Online (Sandbox Code Playgroud)
但这些都不起作用。该命令本身有效,我使用以下方法对其进行了测试:
ENTRYPOINT ["sh", "-c", "echo $(hadoop classpath --glob) >> /tmp/classpath.tmp ...."
Run Code Online (Sandbox Code Playgroud)
启动后该文件包含正确的内容。所以只是设置和保存环境变量有问题。我应该如何设置环境变量?通常你使用类似的东西
ENV CLASSPATH="some classpath"
Run Code Online (Sandbox Code Playgroud)
但在这里我无法使用该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
Run Code Online (Sandbox Code Playgroud)
构建的输出
$ 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
Run Code Online (Sandbox Code Playgroud)
正如您所看到的,将 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
Run Code Online (Sandbox Code Playgroud)
编辑-1
无需配置文件即可尝试此操作
ENTRYPOINT []
CMD ["/bin/sh", "-c", "export CLASSPATH=$(hadoop classpath --glob) && env"]
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
11494 次 |
最近记录: |