docker run script导出env变量

时间:2017-11-09 21:28:15

标签: shell docker dockerfile

我已经搜索了一些问题docker ENV vs RUN export,这些问题解释了这些命令之间的差异,但对解决我的问题没有帮助。

例如,我有一个名为myscript的脚本:

#!/bin/bash
export PLATFORM_HOME="$(pwd)"

在Dockerfile中有以下几行:

...
COPY myscript.sh /
RUN ./myscript.sh

在调用脚本之前,我还尝试使用ENTRYPOINT而不是RUN或声明变量,这一切都没有成功。

我想要实现的是PLATFORM_HOME可以从其他Dockerfiles引用,这些Dockerfiles使用那个作为基础。怎么做?

3 个答案:

答案 0 :(得分:4)

无法将脚本中的变量导出到子图像。作为一般规则,环境变量向下传播,从不向父母传播。

ENV将在构建环境和子图像和容器中保留。

Dockerfile

FROM busybox
ENV PLATFORM_HOME test
RUN echo $PLATFORM_HOME

Dockerfile.child

FROM me/platform
RUN echo $PLATFORM_HOME
CMD ["sh", "-c", "echo $PLATFORM_HOME"]

构建父

docker build -t me/platform .

然后建立孩子:

→ docker build -f Dockerfile.child -t me/platform-test  .
Sending build context to Docker daemon  3.072kB
Step 1/3 : FROM me/platform
 ---> 539b52190af4
Step 2/3 : RUN echo $PLATFORM_HOME
 ---> Using cache
 ---> 40e0bfa872ed
Step 3/3 : CMD sh -c echo $PLATFORM_HOME
 ---> Using cache
 ---> 0c0e842f99fd
Successfully built 0c0e842f99fd
Successfully tagged me/platform-test:latest

然后运行

→ docker run --rm me/platform-test
test

答案 1 :(得分:3)

我认为export会为子进程设置环境变量。所以如果你做RUN或ENTRYPOINT真的没有关系。在阅读linux source command not working when building Dockerfile时,我觉得源命令也无济于事。

如果要在Dockerfile中设置环境变量,则需要使用ENV。

答案 2 :(得分:0)

只需在Dockerfile中使用ENV PLATFORM_HOME=$(pwd)即可。您将从Dockerfile创建的每个容器中访问变量。