微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

使用 docker 构建的 Yarn 工作区

如何解决使用 docker 构建的 Yarn 工作区

考虑以下纱线工作区的文件结构:

.
├── docker-compose.yaml
├── package.json
├── packages
│   └── pkg-1
│       ├── dist
│       ├── package.json
│       ├── src
│       └── tsconfig.json
├── services
│   ├── api-1
│   │   ├── dist
│   │   ├── Dockerfile
│   │   ├── package.json
│   │   ├── src
│   │   ├── tsconfig.json
│   │   └── yarn.lock
│   └── client-1
│       ├── package.json
│       ├── src
│       └── yarn.lock
├── tsconfig.json
└── yarn.lock

我已经编写了 Dockerfile 来为 api-1 创建映像:

ARG APP_DIR=/usr/app

# Build stage
FROM node:16.2-alpine AS build

ARG APP_DIR

workdir ${APP_DIR}
copY package.json ./
copY yarn.lock ./
copY tsconfig.json ./

workdir ${APP_DIR}/packages/pkg-1
copY packages/pkg-1/package.json ./
RUN yarn --pure-lockfile --non-interactive
copY packages/pkg-1/tsconfig.json ./
copY packages/pkg-1/src/ ./src
RUN yarn build

workdir ${APP_DIR}/services/api-1
copY services/api-1/package.json ./
copY services/api-1/yarn.lock ./
RUN yarn --pure-lockfile --non-interactive
copY services/api-1/tsconfig.json ./
copY services/api-1/src/ ./src
RUN yarn build

# Production stage
FROM node:16.2-alpine AS prod

ARG APP_DIR

workdir ${APP_DIR}
copY --from=build ${APP_DIR}/package.json ./
copY --from=build ${APP_DIR}/yarn.lock ./

workdir ${APP_DIR}/packages/pkg-1
copY --from=build ${APP_DIR}/packages/pkg-1/package.json ./
RUN yarn --pure-lockfile --non-interactive --production
copY --from=build ${APP_DIR}/packages/pkg-1/dist ./dist

workdir ${APP_DIR}/services/api-1
copY --from=build ${APP_DIR}/services/api-1/package.json ./
copY --from=build ${APP_DIR}/services/api-1/yarn.lock ./
RUN yarn --pure-lockfile --non-interactive --production
copY --from=build ${APP_DIR}/services/api-1/dist ./dist

CMD ["node","dist"]

构建从根 docker-compose.yaml 运行以获得适当的上下文:

services:
  api-1:
    image: project/api-1
    container_name: api-1
    build:
      context: ./
      dockerfile: ./services/api-1/Dockerfile
      target: prod
    ports:
      - 3000:3000

它正在工作,但这样在应用程序增长时会有很多重复。问题在于包的构建方式。

包可以是例如在客户端服务之间使用的规范化组件集合或在 api 服务之间使用的规范化错误集合。

每当我要构建一些服务时,我都需要首先构建它的依赖包,这是不必要的重复任务。更不用说在使用该包的每个服务的 Dockerfile 中一遍又一遍地定义了各个包的构建步骤。

所以我的问题是。有没有办法创建例如将用于构建服务的包映像以避免在服务 Dockerfile 中定义包的构建步骤?

解决方法

似乎您正在寻找可以让您选择拥有“父”package.json 的选项,因此您只需在其中调用“build”,然后构建整个依赖树。

例如:

- package.json // root package
  | - a
    | - package.json // module a package
  | - b
    | - package.json // module b package

您可能需要查看以下内容:

这两种支持结构都像上面提到的那样,lerna 有更多的功能。要快速掌握差异,请查看此处:Is Lerna needed anymore with NPM 7.0.0's workspaces?

,

不久前我发布了an answer detailing how I structured a monorepo with multiple services and packages

“技巧”是复制您的服务所依赖的所有包,以及项目根 package.json。然后运行 ​​yarn --pure-lockfile --non-interactive --production 一次将为所有子包安装依赖项,因为它们是工作区的一部分。

链接的示例未使用打字稿,但我相信这可以通过在每个运行 postinstallpackage.json 中使用 yarn build 脚本轻松实现。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。