【问题标题】:Docker set environment variable from command or fileDocker 从命令或文件中设置环境变量
【发布时间】:2018-02-24 14:01:20
【问题描述】:

我需要设置一个环境变量CLASSPATH。在该变量中,我需要设置命令的结果:

hadoop classpath --glob

这将返回大量 java 库,它们都需要设置到 CLASSPATH 变量中。最大的问题是我只能在 docker build 完成后运行这个命令,这意味着我必须在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)

【问题讨论】:

    标签: docker environment-variables


    【解决方案1】:

    解决该问题的唯一有效解决方案是在 Dockerfile 中根本不使用 ENTRYPOINT

    1. 创建entrypoint.sh
    2. 将您需要的所有内容(例如导出)添加到该 sh 文件中
    3. 将dockerfile中的entrypoint.sh复制到/
    4. 在 docker run 或 dockercompose 中执行 entrypoint.sh

    注意:需要通过. /entrypoint.sh执行。否则将无法正常工作。

    【讨论】:

      【解决方案2】:

      在这种情况下,我希望使用 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
      

      Edit-1

      无需个人资料即可尝试

      ENTRYPOINT []
      CMD ["/bin/sh", "-c", "export CLASSPATH=$(hadoop classpath --glob) && env"]
      

      【讨论】:

      • 感谢您的回答,但这不起作用。我不能Run echo "export NAME=TARUNLAWANI" >> ~/.profile 因为当我用我真正需要的hadoop classpath --glob 替换你的名字时,我会收到一个错误,因为此时hadoop 还没有启动。您只能在构建完所有内容后运行此命令。
      • 然后在 Dockerfile 中的最后一个命令更改 shell
      • 我不明白它应该如何帮助更改外壳。
      • 在日志文件中,您最后添加的答案语句被声明为“成功”,但是当我在容器中运行printenv 后它启动时没有设置CLASSPATH
      猜你喜欢
      • 2016-12-07
      • 2019-07-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-25
      • 2012-04-22
      相关资源
      最近更新 更多