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

kga*_*lli 10 npm docker dockerfile

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

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

生产:

FROM ...
...
RUN npm install --quiet --production
...
CMD ...
Run Code Online (Sandbox Code Playgroud)

开发/测试:

FROM ...
...
RUN npm install
...
CMD ...
Run Code Online (Sandbox Code Playgroud)

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

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

Boy*_*nux 7

不,你不需要有不同的Dockerfiles,事实上你应该避免这种情况.

docker的目标是将您的应用程序运送到一个不可变的,经过良好测试的工件(docker images)中,这对于生产和测试甚至开发都是相同的.

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

鉴于所有这些,如果通过测试表示unit测试,那么您可以将源代码安装在docker容器中并运行测试而不构建任何docker镜像.那没关系.请记住,您可以为测试构建图像,但速度非常慢,使开发变得安静困难和缓慢,这一点都不好.然后,如果您的测试通过,您可以安全地构建您的app容器.

但是,如果您的意思是接受测试实际上需要针对正在运行的应用程序运行,那么您应该为您的应用程序创建一个映像(只有一个)并在另一个容器中运行测试(例如,安装测试源代码)并对该容器运行测试.这显然意味着您的应用程序的构建对于npm测试的安装而言是不同的.

我希望这会给你一些看法.


Yur*_*uri 2

那么你就必须支持几个Dockerfile几乎相同的 s。相反,我建议使用生产配置文件NodeJS等功能。另一项建议是关于

RUN npm install --quiet --production
Run Code Online (Sandbox Code Playgroud)

最好创建单独的.sh文件并执行如下操作:

ADD ./scripts/run.sh /run.sh
RUN chmod +x /*.sh
Run Code Online (Sandbox Code Playgroud)

并考虑开始使用Gulp

更新#1

默认npm install安装devDependencies. 为了解决这个问题 - 使用npm install --production或将NODE_ENV环境变量设置为production值。

将脚本行放在单独的文件中是一个很好的做法,以免Dockerfile经常更改。如果您下次需要更改,那么您只需更新脚本文件即可完成。将来你可能还有一些额外的工作要做。