使用Yarn工作区在Docker镜像中运行yarn install

24

我正在使用yarn工作区,并且在我的package.json文件中有这些软件包:

  "workspaces": ["packages/*"]

我正试图创建一个Docker镜像以进行部署,我有以下Dockerfile:

# production dockerfile
FROM node:9.2

# add code
COPY ./packages/website/dist /cutting

WORKDIR /cutting

COPY package.json /cutting/
RUN yarn install --pure-lockfile && yarn cache clean --production

CMD npm run serve

但是我收到了以下错误:

错误:发生了意外的错误: "https://registry.yarnpkg.com/@cutting%2futil: Not found"

@cutting/util 是我的一个工作区软件包的名称。

问题在于Docker镜像中没有源代码,因此它会尝试从yarnpkg安装它。

在部署到Docker镜像时,如何处理工作区的最佳方法是什么。


这里的“dist”文件夹包含什么?@Glogo - Tarun Lalwani
dist 是 webpack 构建的捆绑 JavaScript、CSS 和 index.html 的文件夹。 - dagda1
有任何样例项目的 Git 仓库,我可以试一下吗? - Tarun Lalwani
一个可能的解决方案是将整个包直接复制到docker镜像中 RUN yarn add file:./@cutting/util,但肯定有更好的方法。 - Glogo
我最终发布了npm包并采用了这种方式。 - dagda1
2个回答

5

这段代码在docker vm之外不起作用,因此也会在docker中拒绝执行。

问题在于您已经构建了代码并复制了打包的代码。yarn工作区正在寻找一个在dist文件夹中不存在的package.json。工作区只是在一个通用的node_modules文件夹中创建一个链接,指向您正在使用的其他工作区。源代码在那里是必需的。(顺便问一下,为什么不在docker vm内部构建代码呢?这样源代码和dist也将可用。)


2
这是我的Dockerfile文件。我使用yarn工作区和lerna,但不使用lerna也应该类似。您需要构建共享库,然后通过在dist文件夹中运行代码来本地测试构建是否正常运行。"Original Answer"的翻译是"最初的回答"。
###############################################################################
# Step 1 : Builder image
FROM node:11 AS builder
WORKDIR /usr/src/app
ENV NODE_ENV production
RUN npm i -g yarn
RUN npm i -g lerna
COPY ./lerna.json .
COPY ./package* ./
COPY ./yarn* ./
COPY ./.env .
COPY ./packages/shared/ ./packages/shared
COPY ./packages/api/ ./packages/api
# Install dependencies and build whatever you have to build 
RUN yarn install --production
RUN lerna bootstrap
RUN cd /usr/src/app/packages/shared && yarn build
RUN cd /usr/src/app/packages/api && yarn build
###############################################################################
# Step 2 : Run image
FROM node:11
LABEL maintainer="Richard T"
LABEL version="1.0"
LABEL description="This is our dist docker image"
RUN npm i -g yarn
RUN npm i -g lerna
ENV NODE_ENV production
ENV NPM_CONFIG_LOGLEVEL error
ARG PORT=3001
ENV PORT $PORT 
WORKDIR /usr/src/app
COPY ./package* ./
COPY ./lerna.json ./
COPY ./.env ./
COPY ./yarn* ./
COPY --from=builder /usr/src/app/packages/shared ./packages/shared
COPY ./packages/api/package* ./packages/api/
COPY ./packages/api/.env* ./packages/api/
COPY --from=builder /usr/src/app/packages/api ./packages/api
RUN yarn install 
CMD cd ./packages/api && yarn start-production
EXPOSE $PORT
###############################################################################

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接