Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/docker/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Docker为monorepo环境构建_Docker_Lerna_Monorepo_Yarn Workspaces - Fatal编程技术网

Docker为monorepo环境构建

Docker为monorepo环境构建,docker,lerna,monorepo,yarn-workspaces,Docker,Lerna,Monorepo,Yarn Workspaces,基本上,这两种服务foo和bar都依赖于公共库 假设common包已经发布到npm注册表 我在root package.json中添加了所有包共有的devdependency,如下所示: “脚本”:{ “构建”:“lerna运行构建--流”, “设置”:“纱线和纱线构建”, “docker:bootstrap”:“docker compose--file=docker-compose.init.yml build”, “docker:up”:“docker组装--构建” }, “依赖性”:{ “

基本上,这两种服务
foo
bar
都依赖于
公共

假设
common
包已经发布到npm注册表

我在root package.json中添加了所有包共有的devdependency,如下所示:

“脚本”:{
“构建”:“lerna运行构建--流”,
“设置”:“纱线和纱线构建”,
“docker:bootstrap”:“docker compose--file=docker-compose.init.yml build”,
“docker:up”:“docker组装--构建”
},
“依赖性”:{
“@nestjs/cli”:“^7.5.1”,
“@nestjs/common”:“^7.4.4”,
“@nestjs/core”:“^7.4.4”,
“@nestjs/platform express”:“^7.4.4”,
“@nestjs/schematics”:“^7.1.2”,
“@nestjs/testing”:“^7.4.4”,
“@types/express”:“^4.17.8”,
“@types/jest”:“^26.0.13”,
“@types/node”:“^14.10.2”,
“@types/supertest”:“^2.0.10”,
“@typescript eslint/eslint插件”:“^4.1.1”,
“@typescript eslint/parser”:“^4.1.1”,
“eslint”:“^7.9.0”,
“eslint配置美观”:“^6.11.0”,
“eslint插件更漂亮”:“^3.1.4”,
“快车”:“^4.17.1”,
“哈士奇”:“^4.3.0”,
“笑话”:“^26.4.2”,
“勒纳”:“^3.22.1”,
“lint staged”:“^10.4.0”,
“更漂亮”:“^2.1.2”,
“反映元数据”:“^0.1.13”,
“rimraf”:“^3.0.2”,
“rxjs”:“^6.6.3”,
“超级测试”:“^4.0.2”,
“ts玩笑”:“^26.3.0”,
“ts加载器”:“^8.0.3”,
“ts节点”:“^9.0.0”,
“打字脚本”:“3.9.5”
}
foo
软件包需要使用关系数据库,因此我独立安装了以下软件包

$warn workspace foo add@nestjs/typeorm mysql typeorm
要解决错误消息“has unmeted peer dependency”,我点击了以下命令

$warn workspace foo add@nestjs/common@nestjs/core@nestjs/platform express rxjs
我有点迷路了。如果我不断重复自己从一个包到另一个包安装相同的包,那么以monorepo方式组织多个应用程序有什么意义?毕竟,这让我更难写Dockerfile

我的第一个问题是,当开发人员使用单片代码库时,如果需要,将库安装到特定的软件包中是正常行为吗?

以下是我的Dockerfile的外观:

//docker-compose.init.yml
#此文件触发初始生成
版本:“3.8”
服务:
PKU建筑商:
图片:pkg生成器
建造:
上下文:。
dockerfile:dockerfile.init
首先,执行下面的命令

$Thread docker:引导
Dockerfile.init
创建初始生成器映像,“真实”生成器映像可以从中复制生成目录

// Dockerfile.init
FROM scratch

# Copy files from the root to build directory
COPY package.json lerna.json yarn.lock tsconfig.json /build/

# This line is required to install dependencies from foo's package.json
COPY ./packages/foo/package.json /build/packages/foo/package.json
从那时起,使用以下命令生成图像:

$Thread docker:向上
//docker-compose.yml
版本:“3.8”
服务:
PKU建筑商:
图片:pkg生成器
生成:。
马里亚布:
图片:mariadb:10.3
端口:
- "3306:3306"
环境:
-MYSQL\u USER=root
-MYSQL\u ROOT\u PASSWORD=ROOT
-MYSQL\u数据库=教程
重新启动:始终
傅:
货柜名称:foo
构建:./packages/foo
端口:
- "8000:8000"
取决于:
-马里亚布
重新启动:始终
问题是,图像的大小太大了。这是因为,所有的开发依赖项都是从
pkg生成器
复制的

// foo's Dockerfile

FROM node:12-alpine

WORKDIR /app/current

COPY --from=pkg-builder /build/node_modules /app/current/packages/foo/node_modules
COPY --from=pkg-builder /build/tsconfig.json ./tsconfig.json

WORKDIR /app/current/packages/foo

COPY . .

RUN yarn build

EXPOSE 8000

CMD [ "node", "./dist/main" ]


最后,我应该如何缩小图像?在这种情况下,我认为多阶段构建不是缩小尺寸的正确策略。我在这里缺少什么?

每个
包。json
文件需要列出其应用程序的完整即时依赖项。
我应该能够检查您的源代码库,运行
纱线安装
,并有一个可用的应用程序树。如果您的问题是“顺便说一句,这些其他依赖项是安装在环境中的,我只是假设它们存在的”,那么对于那些没有使用您所使用的系统的人来说,这是一个问题,更具体地说,对于Docker和其他自动构建工具来说,这是一个问题

您的库依赖项可以有自己的库依赖项。它们将在
warn.lock
文件中列出,但不需要直接在
package.json
文件中列出

以数据库访问库为例:如果主应用程序使用它们,则需要将它们包含在
依赖项中。但是,如果所有数据库访问都封装在
common
共享库中,那么应用程序只需要引用该库(在
foo/package.json
),库需要包含数据库依赖项(在
common/package.json

您应该将
依赖项
依赖项
中分离出来
运行应用程序(
express
)所需的内容需要列在
依赖项
中;构建应用程序(
eslint
)只需要
devdependency
)。讨论图像大小;这使您能够在实际运行容器时在容器中安装一组小得多的包

(请注意,Thread实际上不支持不安装
devDependencies
;npm支持,但在其他方面使用起来要慢得多。)

然后多阶段构建可以生成更小的映像。这里的想法是第一阶段安装整个开发依赖项,并构建应用程序;第二阶段仅包括运行时依赖项和构建代码。这或多或少看起来像:

ARG节点\u版本=12当前
来自节点:${node_version}作为生成
WORKDIR/app
复制package.json.lock。
运行纱线安装--不可变
复制
长丝织物
来自节点:${node_version}
WORKDIR/app
环境节点_ENV=生产
复制package.json.lock。
运行纱线安装--i
// Dockerfile
FROM node:12-alpine

COPY --from=pkg-builder /build /build

WORKDIR /build

RUN rm -rf node_modules
RUN yarn

CMD ["true"]
// foo's Dockerfile

FROM node:12-alpine

WORKDIR /app/current

COPY --from=pkg-builder /build/node_modules /app/current/packages/foo/node_modules
COPY --from=pkg-builder /build/tsconfig.json ./tsconfig.json

WORKDIR /app/current/packages/foo

COPY . .

RUN yarn build

EXPOSE 8000

CMD [ "node", "./dist/main" ]