【问题标题】:Development dependencies in Dockerfile or separate Dockerfiles for production and testingDockerfile 中的开发依赖项或用于生产和测试的单独 Dockerfile
【发布时间】:2016-03-27 14:11:19
【问题描述】:

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

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

生产:

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

开发/测试:

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

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

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

【问题讨论】:

标签: docker npm dockerfile


【解决方案1】:

那么你必须支持几个几乎相同的Dockerfiles。相反,我建议使用NodeJS 功能,例如production profile。还有一个关于

的建议
RUN npm install --quiet --production

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

ADD ./scripts/run.sh /run.sh
RUN chmod +x /*.sh

也考虑开始使用Gulp

UPD #1

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

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

【讨论】:

  • 感谢您的回答。您能否更详细地描述使用诸如生产配置文件之类的功能将如何帮助我。我仍然会有两个文件,对吧?关于您的第二个建议:您是否建议将特定于环境的行放入脚本并在构建时运行?
【解决方案2】:

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

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

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

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

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

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

【讨论】:

  • 感谢您的回答。我想我明白了你的意思。我的问题是以某种方式将测试源代码及其依赖项注入到包含生产/应用程序代码的图像中。因此,在我的具体情况下,我可以将 node_modues(测试依赖项)和测试源代码安装到包含应用程序的容器中。我可以考虑使用docker-compose 配置文件进行设置。这似乎是正确的方向吗?这种方法的缺点是我的测试将依赖于我注入到容器中的依赖项,而不是生产中使用的依赖项。
  • 这似乎没问题,Docker 和所有进程都相对较新,所以只要您对这些进程感到满意并且最后不会产生更多的工件应该没问题。随着时间的推移,事情变得越来越成熟,请保持警惕并寻找新的解决方案和实践。
  • 顺便说一句,我正在使用我为生产应用程序解释过的程序,并且效果很好。
  • 我不喜欢它。在生产中测试代码总是一个坏主意,并且可能导致安全问题。我创建了一个测试 docker 文件,它以生产映像作为其基础映像 + 测试文件 + mocha,并将 CMD 覆盖为 mocha。效果很好!
猜你喜欢
  • 2018-10-12
  • 2021-11-07
  • 2018-06-15
  • 2016-06-14
  • 2010-12-21
  • 1970-01-01
  • 2018-03-08
  • 2022-11-14
  • 2021-08-17
相关资源
最近更新 更多