我有一个使用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来说,安全地拥有一个更大的测试容器和一个小的生产容器。
答案 0 :(得分:0)
几分
node
的事情。但是,您希望进行多阶段构建的原因是,您使用npm build
构建了应用程序,这些应用程序将这些工件并复制到映像中并以某种方式提供/运行。在go
世界中,这类似于在构建器阶段进行构建,然后仅运行二进制文件。 npm install
,而应仅复制package.json
并对其运行npm install
。这样,docker可以缓存npm install的结果,并在顶部没有任何更改的情况下节省下载节点文件的时间。您的应用程序代码的更改方式比package.json
package.json
并运行npm install
,然后复制其余内容。 希望有帮助。