如何解决使用 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
一次将为所有子包安装依赖项,因为它们是工作区的一部分。
链接的示例未使用打字稿,但我相信这可以通过在每个运行 postinstall
的 package.json
中使用 yarn build
脚本轻松实现。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。