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

用于生产和测试的Dockerfile或单独Dockerfile中的开发依赖项,docker,npm,dockerfile,Docker,Npm,Dockerfile,我不确定是否应该为Node.js应用程序创建不同的Dockerfile文件。一个用于不包含开发依赖项的生产,另一个用于包含开发依赖项的测试 或者一个基本上是developmentDockerfile.dev的文件。这两个文件的主要区别是npm install命令: 制作: FROM ... ... RUN npm install --quiet --production ... CMD ... 开发/测试: FROM ... ... RUN npm install ... CMD ... 出

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

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

制作:

FROM ...
...
RUN npm install --quiet --production
...
CMD ...
开发/测试:

FROM ...
...
RUN npm install
...
CMD ...
出现这个问题是因为我希望能够通过
dockerrun
命令在容器内运行测试。因此,我需要测试依赖项(通常是我的开发依赖项)


将生产中不需要的依赖项放到映像中似乎有点奇怪。另一方面,创建/维护第二个Dockerfile.dev,这只是一个细微的区别,似乎也不正确。那么什么是解决此类问题的好方法呢。

那么您必须支持几个几乎相同的
Dockerfile
s。相反,我建议使用
NodeJS
这样的功能。还有一条关于

RUN npm install --quiet --production
最好创建单独的
.sh
文件,并执行如下操作:

ADD ./scripts/run.sh /run.sh
RUN chmod +x /*.sh
并考虑开始使用

UPD#1 默认情况下,
npm安装
安装
devDependencies
。为了避免这种情况,请使用
npm安装--production
或将
NODE_ENV
环境变量设置为
production


为了不经常更改
Dockerfile
,将脚本行放在单独的文件中是一种很好的做法。如果下次需要更改,则只需更新脚本文件即可。将来您还可以做一些额外的工作。

不,您不需要有不同的
Dockerfile
s,事实上您应该避免这样做

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

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

考虑到所有这些,如果您所说的测试是指
unit
tests,那么您可以将源代码装入docker容器并运行测试,而无需构建任何docker映像。那很好。请记住,您可以为测试构建映像,但速度非常慢,使开发变得非常困难和缓慢,这一点都不好。然后,如果您的测试通过,您就可以安全地构建应用程序容器

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


我希望这能给你一些全面的了解。

谢谢你的回答。您能更详细地描述一下,使用诸如production profile之类的功能对我有什么帮助吗。我还有两个文件,对吗?关于你的第二个建议:你是否建议将特定于环境的行放到脚本中,并在构建时运行它?谢谢你的回答。我想我明白你的意思了。我的问题是以某种方式将测试源代码和it依赖项注入到保存生产/应用程序代码的映像中。因此,在我的具体案例中,我可以将节点模块(测试依赖项)和测试源代码装载到保存应用程序的容器中。我可以考虑使用
docker compose
config文件来设置它。这似乎是正确的方向吗?这种方法的缺点是,我的测试将依赖于我注入容器中的依赖项,而不是生产中使用的依赖项。这似乎没问题,Docker和所有流程都相对较新,所以只要您对流程感到满意,并且最终不会产生更多的工件,就可以了。随着时间的推移,事情变得越来越成熟,请保持头脑清醒,寻找新的解决方案和实践。顺便说一句,我正在使用我为生产应用程序解释的过程,它运行得很好。我不喜欢它。在生产环境中测试代码总是一个坏主意,可能会导致安全问题。我创建了一个测试docker文件,该文件以生产映像为基础映像+测试文件+mocha,并将CMD重写为mocha。很好!我只是想说这是所有Docker文档。而且没有一个是针对测试的。