每个Dockerfile
RUN步骤都运行一个新的容器和一个新的shell。如果尝试在一个shell中设置环境变量,则以后将看不到该变量。例如,您可以尝试以下Dockerfile:
FROM busyboxENV FOO=foo1RUN export FOO=foo2RUN export BAR=barCMD echo FOO is $FOO, BAR is $BAR# Prints "FOO is foo1, BAR is "
有三个好的解决方案。从最容易/最好到最难/最复杂:
完全避免使用环境变量。 将软件安装到“系统”位置,例如
/usr
; 无论如何,它将被隔离在Docker映像中。(不要使用其他隔离工具(例如Python虚拟环境)或版本管理器(例如nvm
或rvm
;),只需安装所需的特定工具即可。)使用
ENV
。这 将 起作用:
FROM busybox ENV FOO=foo2 ENV BAR=bar CMD echo FOO is $FOO, BAR is $BAR # Prints "FOO is foo2, BAR is bar"
- 使用入口点脚本。 通常看起来像:
#!/bin/sh # Read in the file of environment settings . /opt/wherever/env # Then run the CMD exec "$@"
COPY将此脚本放入您的Dockerfile中。使之成为
ENTRYPOINT; 使它
CMD成为您实际正在运行的东西。
FROM busybox WORKDIR /app COPY entrypoint.sh . COPY more_stuff . ENTRYPOINT ["/app/entrypoint.sh"] CMD ["/app/more_stuff/my_app"]
如果你关心这样的事情,环境变量,你通过这种方式设置将不可见
docker inspect或
docker exec调试环境; 但是,如果您
dockerrun-it...sh将它们可见。这是一个有用且足够重要的模式,
CMD除非我专门尝试进行此类初次设置,否则我几乎总是在Dockerfile中使用它。



