在构建 docker 图像时,我应该在哪里“制作”编译代码? 运行?命令?

Where should I `make` compiled code while building docker image? RUN? CMD?

我正在为一些需要使用 distutils.extension 编译的代码构建一个 docker 图像。我有一个 运行s python setup.py build_ext --inplace.

的 Makefile

我应该做吗

RUN make 

CMD ["make"]

我发现 blog post for maven compile which used RUN. Also this gcc image suggests using RUN gcc -o myapp main.c, suggesting that RUN will work to compile my code, but other resources (How to build a c-image in a container, ) 建议在图像中包含已编译的代码使其大小膨胀,这让我觉得我应该使用 CMD 因为直到容器 CMD 才会执行=31=]。

运行 命令在构建图像时执行一次。 CMD 将在每次启动容器时执行。

使用 CMD 将导致每次启动容器时编译您的代码。您的图像是打算在 运行 应用程序上使用,还是只是创建应用程序,然后将其移动到其他地方?对于前者,您肯定会希望在构建图像时使用 运行 编译它。

自从引入 multi stage builds 以来,增加的图像大小不再是一个问题,因为您可以在一个图像中编译您的应用程序,然后只将生成的可执行文件传输到最终图像。

除非有特殊原因,否则在 CMD 短语中编译是没有意义的。