microservices - 开发人员是否应该能够在他们的开发环境中从 lerna monorepo 创建一个 docker 工件?
问题描述
我最近开始使用 lerna 来管理 monorepo,并且在开发中它运行良好。
Lerna 在我的各种包之间创建符号链接,因此像 'tsc --watch' 或 nodemon 这样的工具可以很好地检测其他包中的更改。
但是我在这个环境中创建 docker 镜像时遇到了问题。
假设我们有一个具有这种结构的项目:
root
packages
common → artifact is a private npm package, this depends on utilities, something-specific
utilities → artifact is a public npm package
something-specific -> artifact is a public npm package
frontend → artifact is a docker image, depends on common
backend → artifact is a docker image, depends on common and utilities
在这种情况下,在开发中,一切都很好。我正在运行某种实时重新加载服务器,并且符号链接可以正常工作,以便依赖项正常工作。
现在假设我想从后端创建一个 docker 映像。
我将介绍一些场景:
我
ADD
在我的 Dockerfile 中打包.json,然后运行 npm install。不起作用,因为未发布公共和实用程序包。
我在后端运行我的构建命令,在 docker 文件中添加 /build 和 /node_modules。
不起作用,因为我构建的后端有
require('common')
和require('utilities')
命令,它们在 node_modules (符号链接)中,但 Docker 只会忽略这些符号链接文件夹。解决方法:使用
cp --dereference
“取消符号链接”节点模块有效。请参阅此AskUbuntu 问题。第 1 步,但在构建 docker 映像之前,我发布了 npm 包。
这工作正常,但对于正在检查代码库并修改
common
orutilities
的人来说,它不会工作,因为他们没有发布 npm 包的权限。我将
build
命令配置backend
为不视为common
或utilities
视为外部,并且common
不something-specific
视为外部。我认为首先构建
something-specific
,然后common
,然后utilities
,然后backend
。这样,当构建发生时,并在 webpack 中使用这种技术,bundle 将包含来自
something-specfic
、common 和utilities
.但这管理起来很麻烦。
这似乎是我试图在这里解决的一个非常简单的问题。当前在我的机器上运行的代码,我想拉出并放入一个 docker 容器中。
记住我们在这里想要实现的关键是让某人能够检查代码库,修改任何包,然后构建一个 docker 映像,所有这些都来自他们的开发环境。
是否有我在这里遗漏的明显 lerna 技术,或者我可以用来考虑解决这个问题的 devops 参考框架?
解决方案
我们遇到了类似的问题,这就是我们所做的:将 Dockerfile 放在 monorepo 的根目录中(lerna.json 所在的位置)。
原因:您确实将整个 repo 视为单一事实来源,并且您希望对整个 repo 的任何修改都反映在 docker 映像中,因此为单个包使用单独的 Dockerfile 就没有意义了。
Dockerfile
FROM node:12.13.0
SHELL ["/bin/bash", "-c"]
RUN mkdir -p /app
WORKDIR /app
# Install app dependencies
COPY package.json /app/package.json
COPY yarn.lock /app/yarn.lock
COPY packages/frontend/package.json /app/packages/frontend/package.json
COPY packages/backend/package.json /app/packages/backend/package.json
COPY lerna.json /app/lerna.json
RUN ["/bin/bash", "-c", "yarn install"]
# Bundle app source
COPY . /app
RUN ["/bin/bash", "-c", "yarn bootstrap"]
RUN ["/bin/bash", "-c", "yarn build"]
EXPOSE 3000
CMD [ "yarn", "start" ]
包.json
{
"private": true,
"workspaces": [
"packages/*"
],
"scripts": {
"bootstrap": "lerna clean --yes && lerna bootstrap",
"build": "lerna run build --stream",
"start": "cross-env NODE_ENV=production node dist/backend/main",
},
"devDependencies": {
"lerna": "^3.19.0",
"cross-env": "^6.0.3"
},
}
推荐阅读
- java - 创建一个长度由用户输入确定的数组:C vs C99 vs Java
- angular - Angular 5:请求不同布局的多种语言
- javascript - 使用除圆形以外的其他形状来设置 mapbox 点的样式
- javascript - Python Bokeh 标题和工具栏未呈现
- c# - 由空白行填充的 DataGrid 动态表 C#
- c# - 在 Dynamics CRM 中分解日期
- haskell - 对不同的数据类型构造函数使用不同的最小完整定义
- java - 滚动时如何在工具栏下方固定线性布局
- macos - Visual Studio 中 Mac 中 xamarin.forms 的 Nuget 包
- php - PHP - File_get_contents 未检测到 CURL 响应