我已经搜索了一些像docker ENV vs RUN export这样的问题,它解释了这些命令之间的差异,但没有帮助解决我的问题。
例如,我有一个名为myscript
的脚本:
#!/bin/bash
export PLATFORM_HOME="$(pwd)"
在Dockerfile中有以下行:
...
COPY myscript.sh /
RUN ./myscript.sh
我还尝试在调用脚本之前使用ENTRYPOINT而不是RUN或声明变量,所有这些都没有成功。
我想要实现的是PLATFORM_HOME
可以从其他Dockerfiles引用,它使用那个作为基础。怎么做 ?
无法将变量从脚本导出到子图像。作为一般规则,环境变量向下传播,从不向父母传播。
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
我认为export会为子进程设置环境变量。所以如果你做RUN或ENTRYPOINT真的没关系。在阅读linux source command not working when building Dockerfile时,我觉得源命令也无济于事。
如果要在Dockerfile中设置环境变量,则需要使用ENV。
只需在Dockerfile中使用ENV PLATFORM_HOME=$(pwd)
即可。您将从Dockerfile创建的每个容器中访问变量。