docker - Dockerfile 中的开发依赖项或用于生产和测试的单独 Dockerfile

我不确定是否应该为我的 Node.js 应用程序创建不同的 Dockerfile 文件。一种用于没有开发依赖项的生产,另一种用于包含开发依赖项的测试。

或者一个基本上是开发Dockerfile.dev的文件。那么这两个文件的主要区别是 npm install 命令:

生产:

FROM ...
...
RUN npm install --quiet --production
...
CMD ...

开发/测试:

FROM ...
...
RUN npm install
...
CMD ...

问题出现是因为我希望能够通过 docker run 命令在容器内运行我的测试。因此我需要测试依赖项(通常是我的开发依赖项)。

将生产中不需要的依赖项放入镜像中似乎有点奇怪。另一方面,创建/维护第二个 Dockerfile.dev 只是微小的差异似乎也不正确。那么对于这类问题有什么好的做法呢。

最佳答案

不,您不需要有不同的 Dockerfile,实际上您应该避免这种情况。

docker 的目标是在一个不可变的、经过良好测试的工件(docker 镜像)中发布您的应用程序,该工件对于生产、测试​​甚至开发都是相同的。

为什么?因为如果你为测试和生产构建不同的工件,你怎么能保证你已经测试过的东西也在生产中工作?你不能,因为它们是两个不同的东西。

考虑到所有这些,如果测试是指 unit 测试,那么您可以将源代码安装在 docker 容器中并运行测试,而无需构建任何 docker 镜像。这很好。请记住,您可以为测试构建镜像,但这非常慢,并且使开发变得困难而缓慢,这根本不好。然后,如果您的测试通过,您就可以安全地构建您的应用容器。

但是,如果您的意思是实际需要针对您正在运行的应用程序运行的验收测试,那么您应该为您的应用程序创建一个镜像(仅一个)并在另一个容器中运行测试(例如挂载测试源代码)并针对该应用程序运行测试容器。这显然意味着您的应用程序构建对于 npm 为您的测试安装是不同的。

我希望这能让你有所了解。

https://stackoverflow.com/questions/34396759/

相关文章:

android - 为什么安卓模拟器这么慢?我们如何加快Android模拟器的速度?

android - 如何以编程方式关闭/隐藏 Android 软键盘?

linux - nginx/apache重定向vps上docker容器上的输出端口

android - 如何使用保存实例状态保存 Activity 状态?

android - 如何在 Android 的 ListView 中延迟加载图像

android - 当 Activity 在 Android 中启动时,如何阻止 EditText

android - Eclipse Android 插件中的 "Debug certificate

android - Android 上的 'Context' 是什么?

android - 是否有唯一的 Android 设备 ID?

android - 如何在 TextView 中水平和垂直居中文本?