如果我想在我的容器中运行python脚本,那么使用RUN
命令有什么意义,如果我可以在构建时传入参数并运行脚本?
每次运行容器时,我都希望x.py
在构建阶段传入的ENV
变量上运行。
如果我要使用Swarm,并且唯一的目标是运行x.py脚本,那么swarm只会构建节点,而不是构建并最终运行,因为CMD
和ENTRYPOINT
说明仅在运行时发生。
我错过了什么吗?
答案 0 :(得分:3)
docker build
命令创建一个不可变的图像。 docker run
命令创建一个容器,该容器将图像用作基本文件系统,图像中的其他元数据用作默认值来运行该图像。
Dockerfile中的每个RUN
行用于向docker中的图像文件系统添加图层。 Docker实际上在临时容器中执行该任务,因此选择了令人困惑的“运行”术语。从RUN
命令保留的唯一内容是文件系统更改,正在运行的进程,对环境变量的更改,当前工作目录等shell设置,在{{{}完成后清除临时容器时全部丢失。 1}}命令。
RUN
和ENTRYPOINT
值用于指定启动容器时要运行的默认命令。如果两者都已定义,则结果是运行入口点的值,并将cmd的值作为命令行参数附加。 CMD
的值很容易在CMD
命令行的末尾覆盖,因此通过使用它们,您可以轻松地重新配置使用不同用户输入参数运行相同命令的容器。
如果您尝试运行的命令需要在每次容器启动时执行,而不是存储在不可变图像中,那么您需要在docker run
或ENTRYPOINT
中执行该命令。这将增加容器启动时间,因此如果该命令的结果可以存储为文件系统更改并缓存以供将来运行的所有容器使用,那么您希望在CMD
行中进行该设置。