Node Docker构建和生产容器最佳实践

时间:2019-07-10 21:24:07

标签: node.js mongodb typescript docker alpine

我有一个使用MongoDB的Node项目。为了进行自动化测试,我们使用Mongo Memory Server

对于Mongo Memory Server,我的Mongo不支持Alpine,因此它不能在Alpine映像上运行

从文档中

  

目前没有针对高山linux的正式MongoDB版本。这意味着我们不能为Alpine(或MongoDB官方不支持的任何其他平台)提取二进制文件,但是您可以使用已内置mongod的Docker映像,然后将MONGOMS_SYSTEM_BINARY变量设置为指向该二进制文件。这应该允许您在可以安装mongod的任何系统上使用mongodb-memory-server。

我可以使用Node基本映像在Docker容器中运行所有测试,但是在生产中,我想使用Alpine映像来节省内存。

所以我的Dockerfile看起来像这样。

FROM node:x.x.x as test

WORKDIR /app

COPY . /app

npm install
npm run build # we use Typescript, this runs the transpilation
npm test # runs our automated tests

FROM node:x.x.x-alpine

WORKDIR /app

COPY --from=test /app/src /app/src
COPY --from=test /app/package.json /app/package.json
COPY --from=test /app/package-lock.json /app/package-lock.json
COPY --from=test /app/config /app/config
COPY --from=test /app/scripts /app/scripts

RUN npm install --production

RUN npm run build

进行烟雾测试,生成的Alpine图像似乎可以正常工作。我认为这是安全的,因为我将模块安装在高山映像本身中。

我想知道,这是最佳做法吗?有没有更好的方法来做这样的事情?也就是说,对于Node来说,安全地拥有一个更大的测试容器和一个小的生产容器。

1 个答案:

答案 0 :(得分:0)

几分

  1. 如果要构建两次,那么多阶段构建的意义是什么。我没有做太多node的事情。但是,您希望进行多阶段构建的原因是,您使用npm build构建了应用程序,这些应用程序将这些工件并复制到映像中并以某种方式提供/运行。在go世界中,这类似于在构建器阶段进行构建,然后仅运行二进制文件。
  2. 您始终希望在联合文件系统的顶部拥有变化最大的东西。这意味着您不必复制整个应用程序代码并运行npm install,而应仅复制package.json并对其运行npm install。这样,docker可以缓存npm install的结果,并在顶部没有任何更改的情况下节省下载节点文件的时间。您的应用程序代码的更改方式比package.json
  3. 在第二阶段,同样的想法。如果必须-首先复制package.json并运行npm install,然后复制其余内容。
  4. 如果需要,可以有更多阶段。游戏的名称是获得最精简最干净的最终阶段图像。多数民众赞成在注册表上。其他所有东西都可以并且应该删除。

希望有帮助。

相关问题