使用 Yarn 2 (Berry) 在 Docker 镜像中打包应用程序

Posted

技术标签:

【中文标题】使用 Yarn 2 (Berry) 在 Docker 镜像中打包应用程序【英文标题】:Using Yarn 2 (Berry) for packaging application in a Docker image 【发布时间】:2021-10-27 07:17:27 【问题描述】:

我正在将 VueJS 应用程序从“经典”Yarn 1.x 迁移到 Yarn 2。遵循 install documentation 很简单,并且可以正常工作。

将应用程序打包到 Docker 映像中时会遇到棘手的问题。

当前 Dockerfile

FROM node:14-alpine AS build-stage

WORKDIR /app

COPY package.json yarn.lock ./

RUN yarn install

COPY . ./

RUN yarn build --modern \
    && find dist -type f -exec gzip -k "" \;

FROM nginx:mainline-alpine as production-stage

RUN apk add --no-cache curl

HEALTHCHECK CMD curl -f http://localhost || exit 1

COPY docker/entrypoint.sh /
RUN chmod +x /entrypoint.sh

COPY docker/app.nginx /etc/nginx/conf.d/default.conf
COPY --from=build-stage /app/dist /usr/share/nginx/html

ENTRYPOINT [ "/entrypoint.sh" ]

也许我看错了地方,但我找不到任何信息,Yarn 2 Zero-Install setup 看起来像 Docker 映像。

您对如何在Dockerfile 中使用 Yarn 2 方法有什么建议吗?

【问题讨论】:

【参考方案1】:

由于 yarn 2 的包安装过程有一个奇怪的 catch-22,我发现这是使用 docker 安装 yarn@berry 的最有效方法。可能有更好的方法,但我不知道。

FROM node:latest as build
WORKDIR /app

# copy only the package.json file so yarn set version can
# correctly download its modules for berry without overwriting
# the existing yarnrc and cache files. If the rc is added now,
# yarn will attempt to use the berry module without it being
# installed.
COPY package.json .
RUN yarn set version berry

# and _now_ pull in the rest of the build files overriding
# the rc generated by setting the yarn version
COPY yarn.lock .yarn .yarnrc.yml ./
RUN yarn install
COPY . .

# continue with your build process

然而,我会注意到,yarn 旨在从本地 .yarn/releases 文件夹中运行,所以最好的方法可能只是在本地安装 yarn2 和 @ 987654321@。然后作为拉入package.json 文件的初步步骤,拉取必要的.yarn 文件,如上所示。这应该在大多数情况下都可以工作,但是有时它给我带来了困难,因此上面的例子。

FROM node:latest as build
WORKDIR /app

# Copy in the package file as well as other yarn
# dependencies in the local directory, assuming the
# yarn berry release module is inside .yarn/releases
# already
COPY package.json yarn.lock .yarn .yarnrc.yml ./

RUN yarn install
COPY . .

# continue with your build process

【讨论】:

以上是关于使用 Yarn 2 (Berry) 在 Docker 镜像中打包应用程序的主要内容,如果未能解决你的问题,请参考以下文章

在 Yarn 2 (berry) 中审计依赖项的最佳方法是啥?

使用 yarn berry 时将 .yarn 目录提交到 git

$ yarn install 导致找不到模块 yarn-berry.js

为啥 Mocha 不与 Yarn Berry 合作?

yarn berry run 如何运行已安装的包

我如何直接将“node_modules”与“yarn berry”一起使用