docker运行脚本,导出环境变量

mar*_*kin 6 shell docker dockerfile

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

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

#!/bin/bash
export PLATFORM_HOME="$(pwd)"
Run Code Online (Sandbox Code Playgroud)

并在Dockerfile中包含以下几行:

...
COPY myscript.sh /
RUN ./myscript.sh
Run Code Online (Sandbox Code Playgroud)

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

我要实现的目标是PLATFORM_HOME可以从其他以该基准为基础的Dockerfile引用。怎么做 ?

Mat*_*att 5

无法将变量从脚本导出到子图像。作为一般规则,环境变量向下传播,永远不会到达父级。

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

Dockerfile

FROM busybox
ENV PLATFORM_HOME test
RUN echo $PLATFORM_HOME
Run Code Online (Sandbox Code Playgroud)

Dockerfile.child

FROM me/platform
RUN echo $PLATFORM_HOME
CMD ["sh", "-c", "echo $PLATFORM_HOME"]
Run Code Online (Sandbox Code Playgroud)

构建父级

docker build -t me/platform .
Run Code Online (Sandbox Code Playgroud)

然后构建孩子:

? 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
Run Code Online (Sandbox Code Playgroud)

然后运行

? docker run --rm me/platform-test
test
Run Code Online (Sandbox Code Playgroud)

  • +1 稍有不同,Dockerfile 中的“RUN”执行命令,并在退出该命令时,文件系统更改将保留在正在创建的镜像层中。对环境的更改、生成的守护进程等不会在映像中捕获。 (4认同)