【发布时间】:2017-02-09 17:14:40
【问题描述】:
在将 dockerized node.js 运送到生产环境时, 发布包含开发依赖项的图像是否正确?
我不是在说开发依赖
不是packages.json中列出的devDependencies,我的意思是gcc、python、node-gyp、其他一些*-dev包,包含一堆头文件、静态库。
都需要编译一些节点依赖(比如node-sass)
一个想法可以是两阶段构建,一个包含所有 *-dev 依赖项的映像,在其中构建内容,然后将结果导出到另一个仅包含二进制文件的新映像。
- 优点:最终的“生产”图像很小
- 缺点:不是标准的图像构建方式
一般来说,我想在 docker 镜像中分发的任何已编译软件都不应包含用于构建二进制文件的编译器、头文件和工具。
【问题讨论】:
-
'发送包含开发依赖项的图像是否正确?我不是在谈论开发依赖关系,哈哈
-
这就是为什么括号解释了我所指的开发依赖项,但是是的,哈哈
-
这个问题太笼统了。对于 C++ 项目。干净的图像将仅包含 *.so 供您的主程序使用。您可以通过
apt install libxxx而不是apt install ibxxx-dev来执行此操作。或者,您可以使用ldd查找所有依赖项,将主程序、所需的*.so、资源文件复制到现有的官方Linux 映像上。对于python,没有干净的方法可以做到这一点。 Python 依赖关系太复杂了。对于新时代的编程语言,例如 Golang 或 Rust,捆绑要容易得多,因为它们默认是静态链接的。而且不会有依赖地狱。
标签: node.js docker production node-gyp