首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >运行多堆栈docker构建的docker映像失败- Nexts找不到react模块

运行多堆栈docker构建的docker映像失败- Nexts找不到react模块
EN

Stack Overflow用户
提问于 2020-12-27 01:25:30
回答 1查看 233关注 0票数 0

我正在为一个在lerna monorepo中使用nextjs和preact的项目构建一个多阶段docker映像。

多阶段构建成功了,然而,当我想运行镜像时,nextjs抛出一个错误,说找不到'react‘。

用于多阶段构建的Dockerfile:

代码语言:javascript
复制
FROM node:12 as builder

RUN curl -sfL https://install.goreleaser.com/github.com/tj/node-prune.sh | bash -s -- -b /usr/local/bin

RUN npm -g config set user root && \
    npm install -g lerna

WORKDIR /app
COPY . ./

ARG TARGET_APP_FOLDER=apps/app-1

# Install dependencies
COPY yarn.lock ./
WORKDIR /app/${TARGET_APP_FOLDER}
RUN lerna bootstrap \
    -- --production

# Build
ARG PROJECT_ID
RUN test -n "$PROJECT_ID" || (echo "PROJECT_ID not set. Need to set PROJECT_ID to the GCP project ID you're deploying to" && false)

ENV PROJECT_ID=${PROJECT_ID}
RUN yarn run build:prod && \
    /usr/local/bin/node-prune

################################################

# Our final image
FROM node:12-alpine

RUN yarn global add next

ARG TARGET_APP_FOLDER=apps/app-1

WORKDIR /app

# copy from build image
COPY --from=builder /app/node_modules ./node_modules
COPY --from=builder /app/${TARGET_APP_FOLDER}/.next ./.next
COPY --from=builder /app/${TARGET_APP_FOLDER}/node_modules ./node_modules
COPY --from=builder /app/${TARGET_APP_FOLDER}/package.json ./package.json

ENV PORT=8080
CMD yarn run start -p ${PORT}

我在期末考试中验证了react模块已经复制到node_modules文件夹中。react模块本身只是使用别名来使用preact/compat

当在一个构建器中运行所有东西时,它工作得非常好:

代码语言:javascript
复制
FROM node:12 as builder

RUN curl -sfL https://install.goreleaser.com/github.com/tj/node-prune.sh | bash -s -- -b /usr/local/bin

RUN npm -g config set user root && \
    npm install -g lerna

WORKDIR /app
COPY . ./

ARG TARGET_APP_FOLDER=apps/app-1

# Install dependencies
COPY yarn.lock ./
WORKDIR /app/${TARGET_APP_FOLDER}
RUN lerna bootstrap \
    -- --production

# Build
ARG PROJECT_ID
RUN test -n "$PROJECT_ID" || (echo "PROJECT_ID not set. Need to set PROJECT_ID to the GCP project ID you're deploying to" && false)

ENV PROJECT_ID=${PROJECT_ID}
RUN yarn run build:prod && \
    /usr/local/bin/node-prune

# Start the server
ENV PORT=8080
CMD yarn run start -p ${PORT}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-03-08 21:45:03

修好了!

这是我现在正在使用的dockerfile,以防有人遇到同样的问题:

代码语言:javascript
复制
FROM node:12-alpine AS base

# DEFAULT ARGS
ENV BUILD_FOLDER=/build
ENV TARGET_APP_FOLDER=/apps/my_app

# CHECK PROJECT ID IS SET
ARG PROJECT_ID
RUN test -n "$PROJECT_ID" || (echo "PROJECT_ID not set. Need to set PROJECT_ID to the GCP project ID you're deploying to" && false)
ENV PROJECT_ID=${PROJECT_ID}

###### BUILDER BASE PREPARING FILES ######

FROM base AS builder_base

WORKDIR /base

RUN apk update && \
    apk add curl bash && \
    apk --no-cache add g++ make libpng-dev && \
    curl -sfL https://install.goreleaser.com/github.com/tj/node-prune.sh | bash -s -- -b /usr/local/bin

# COPY YARN LOCK
COPY yarn.lock ./

# Copy source
COPY . ./

# Remove unused source
RUN bin/delete-unused-apps.sh ${TARGET_APP_FOLDER}

###### BUILDER ######

FROM builder_base AS build
WORKDIR ${BUILD_FOLDER}
COPY --from=builder_base /base ./

ENV PATH=${BUILD_FOLDER}/node_modules/.bin:$PATH
RUN yarn install --production

WORKDIR ${BUILD_FOLDER}/${TARGET_APP_FOLDER}

RUN yarn build:prod && \
    /usr/local/bin/node-prune


###### RUNNER ######

FROM base AS runner
ARG PROJECT_ID
ENV PROJECT_ID=${PROJECT_ID}
ENV PATH=/app/node_modules/.bin:$PATH
WORKDIR /app

COPY --from=build ${BUILD_FOLDER}/node_modules ./node_modules
COPY --from=build ${BUILD_FOLDER}${TARGET_APP_FOLDER}/.next ./.next
COPY --from=build ${BUILD_FOLDER}${TARGET_APP_FOLDER}/public ./public
COPY --from=build ${BUILD_FOLDER}${TARGET_APP_FOLDER}/package*.json ./

# Start the server
ENV PORT=8080
CMD yarn run start -p ${PORT}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65458894

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档