- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
我正在尝试将 Node 应用程序转换为使用 Docker,但遇到了一些我无法回答的问题。
但为了简单起见,我包含了一些非常基本的示例文件,以使问题保持在目标上。事实上,下面的示例只是链接到一个 Mongo 容器,但并没有在代码中使用它以使其更简单。
首先,需要什么 Dockerfile
和 docker-compose.yml
设置才能在本地 (OS X) 开发的 Node + Express + Mongo 应用程序上成功使用 Docker以及用于生产版本?
FROM node:6.3.0
# Create new user to avoid using root - is this correct practise?
RUN useradd --user-group --create-home --shell /bin/false app
COPY package.json /home/app/code/
RUN chown -R app:app /home/app/*
USER app
WORKDIR /home/app/code
# Should this even be set here or use docker-compose instead?
# And should there be:
# - docker-compose.yml setting it to production by default
# - docker-compose.dev.yml setting it to production?
# Or reverse it? (docker-compose.prod.yml instead with default being development?)
# Commenting below out or it will always run as production
#ENV NODE_ENV production
RUN npm install
USER root
COPY . /home/app/code
# Running chown to ensure new 'app' user owns files
RUN chown -R app:app /home/app/*
USER app
EXPOSE 3000
# What CMD should be here to ensure development versus production is simple?
# Development - Restart server and refresh browser on file changes
# Production - Ensure uptime.
CMD ["npm", "start"]
version: "2"
services:
web:
build: .
# I would normally use a .env file but for this example will set explicitly
# env_file: .env
environment:
- NODE_ENV=production
volumes:
- ./:/home/app/code
- /home/app/code/node_modules
ports:
- "3000:3000"
links:
- mongo
mongo:
image: mongo
ports:
- "27017:27017"
version: "2"
services:
web:
# I would normally use a .env file but for this example will set explicitly
# env_file: .env
environment:
- NODE_ENV=development
{
"name": "docker-node-test",
"version": "1.0.0",
"description": "",
"main": "app.js",
"scripts": {
"start": "nodemon app.js"
},
"dependencies": {
"express": "^4.14.0",
"mongoose": "^4.6.1",
"nodemon": "^1.10.2"
},
"devDependencies": {
"mocha": "^3.0.2"
}
}
这是我的主要问题和难题。
在我使用的示例中,NODE_ENV 在 Dockerfile 中设置为 production
,并且有两个 docker-compose 文件:
production
development
1.1. 是否建议切换该顺序并将开发设置作为默认设置,而不是使用 docker-compose.prod.yml 进行覆盖?
1.2.如何处理node_modules目录?
我真的不确定如何在本地开发需求和生产运行之间处理 node_modules 目录。 (也许我有一个根本的误解?)
编辑:
我添加了一个 .dockerignore
文件并将 node_modules 目录包含为一行。这样可以确保在复制过程中忽略 node_modules 目录等。
然后我编辑了 docker-compose.yml
以将 node_modules 包含为一个卷。
volumes:
- ./:/home/app/code
- /home/app/code/node_modules
为了完整起见,我还在问题开头将上述更改放入完整的 docker-compose.yml
中。
这甚至是一个解决方案吗?
执行上述操作可确保我的本地开发 npm install 包含开发依赖项。当运行 docker-compose up 时,它会在 Docker 容器中拉入仅用于生产的 Node 模块(因为默认的 docker-compose.yml 设置为 NODE_ENV=production)。
但是运行 docker-compose -f docker-compose.yml build
时,似乎没有考虑到 2 个 docker-compose 文件中设置的 NODE_ENV :/我希望它发送 NODE_ENV =生产,但所有 node_modules 都重新安装(包括开发依赖项)。
我们是否改为使用 2 个 Dockerfile? (用于生产的 Dockerfile;用于本地开发的 Dockerfile.dev)
(我觉得这是我在设置中缺少的基本逻辑/知识)
如何在本地开发机器上使用 nodemon
而在生产版本上使用 PM2?
它默认使用 root
用户,但我没有看到很多文章谈论在容器中创建专用用户。我为安全所做的一切正确吗?我当然不会觉得在非 Docker 构建上以 root 身份运行应用程序。
感谢您的阅读。任何和所有的帮助表示赞赏:)
最佳答案
要么,没关系,我更喜欢有开发细节,然后用生产细节覆盖。
我没有将它们提交到我的仓库,然后我的 dockerfile 中有“npm install”。
您可以根据build设置在 dockerfile 中设置要构建的规则。
典型的做法是通过 root 构建一切,并通过 root 运行主程序。您可以设置其他用户,但在大多数情况下不需要这样做,因为 docker 容器的想法是将每个进程隔离在单独的 docker 容器中。
关于node.js - Node (Express & Mongo) 应用程序的生产与开发 Docker 设置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39686643/
我正在通过 labrepl 工作,我看到了一些遵循此模式的代码: ;; Pattern (apply #(apply f %&) coll) ;; Concrete example user=> (a
我从未向应用商店提交过应用,但我会在不久的将来提交。 到目前为止,我对为 iPhone 而非 iPad 进行设计感到很自在。 我了解,通过将通用PAID 应用放到应用商店,客户只需支付一次就可以同时使
我有一个应用程序,它使用不同的 Facebook 应用程序(2 个不同的 AppID)在 Facebook 上发布并显示它是“通过 iPhone”/“通过 iPad”。 当 Facebook 应用程序
我有一个要求,我们必须通过将网站源文件保存在本地 iOS 应用程序中来在 iOS 应用程序 Webview 中运行网站。 Angular 需要服务器来运行应用程序,但由于我们将文件保存在本地,我们无法
所以我有一个单页客户端应用程序。 正常流程: 应用程序 -> OAuth2 服务器 -> 应用程序 我们有自己的 OAuth2 服务器,因此人们可以登录应用程序并获取与用户实体关联的 access_t
假设我有一个安装在用户设备上的 Android 应用程序 A,我的应用程序有一个 AppWidget,我们可以让其他 Android 开发人员在其中以每次安装成本为基础发布他们的应用程序推广广告。因此
Secrets of the JavaScript Ninja中有一个例子它提供了以下代码来绕过 JavaScript 的 Math.min() 函数,该函数需要一个可变长度列表。 Example:
当我分别将数组和对象传递给 function.apply() 时,我得到 NaN 的 o/p,但是当我传递对象和数组时,我得到一个数字。为什么会发生这种情况? 由于数组也被视为对象,为什么我无法使用它
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界. 这篇CFSDN的博客文章ASP转换格林威治时间函数DateDiff()应用由作者收集整理,如果你
我正在将列表传递给 map并且想要返回一个带有合并名称的 data.frame 对象。 例如: library(tidyverse) library(broom) mtcars %>% spl
我有一个非常基本的问题,但我不知道如何实现它:我有一个返回数据框,其中每个工具的返回值是按行排列的: tmp<-as.data.frame(t(data.frame(a=rnorm(250,0,1)
我正在使用我的 FB 应用创建群组并邀请用户加入我的应用群组,第一次一切正常。当我尝试创建另一个组时,出现以下错误: {"(OAuthException - #4009) (#4009) 在有更多用户
我们正在开发一款类似于“会说话的本”应用程序的 child 应用程序。它包含大量用于交互式动画的 JPEG 图像序列。 问题是动画在 iPad Air 上播放正常,但在 iPad 2 上播放缓慢或滞后
我关注 clojure 一段时间了,它的一些功能非常令人兴奋(持久数据结构、函数式方法、不可变状态)。然而,由于我仍在学习,我想了解如何在实际场景中应用,证明其好处,然后演化并应用于更复杂的问题。即,
我开发了一个仅使用挪威语的应用程序。该应用程序不使用本地化,因为它应该仅以一种语言(挪威语)显示。但是,我已在 Info.plist 文件中将“本地化 native 开发区域”设置为“no”。我还使用
读完 Anthony's response 后上a style-related parser question ,我试图说服自己编写单体解析器仍然可以相当紧凑。 所以而不是 reference ::
multicore 库中是否有类似 sapply 的东西?还是我必须 unlist(mclapply(..)) 才能实现这一点? 如果它不存在:推理是什么? 提前致谢,如果这是一个愚蠢的问题,我们深表
我喜欢在窗口中弹出结果,以便更容易查看和查找(例如,它们不会随着控制台继续滚动而丢失)。一种方法是使用 sink() 和 file.show()。例如: y <- rnorm(100); x <- r
我有一个如下所示的 spring mvc Controller @RequestMapping(value="/new", method=RequestMethod.POST) public Stri
我正在阅读 StructureMap关于依赖注入(inject),首先有两部分初始化映射,具体类类型的接口(interface),另一部分只是实例化(请求实例)。 第一部分需要配置和设置,这是在 Bo
我是一名优秀的程序员,十分优秀!