使用自定义依赖项在Docker容器中部署Next.js

rqqzpn5f  于 2022-11-03  发布在  Docker
关注(0)|答案(1)|浏览(168)

我是Next.js和Docker的新手。我试图实现的是用Docker部署一个Next.js项目。我正在创建Dockerfile和docker-compose.yml文件。但是,该项目有一些自定义包,它在源文件夹之外使用(在根级别上)。我的构建步骤失败了,因为它不能解析这些包。
COPY

这是汇入的外观

import Theme, { theme } from '@custompackage/themes/src/Simply';
import {
  Navbar,
  Copyright,
  Welcome,
  Services,
  About,
  Pricing,
  Clients,
  Contact,
} from '@custompackage/themes/src/Simply/containers';

import preview from '@custompackage/themes/src/Simply/assets/preview.jpg';

这是我的Dockerfile


# Install dependencies only when needed

FROM node:16-alpine AS deps

WORKDIR /opt/app
COPY package.json yarn.lock ./
RUN yarn install --frozen-lockfile

# Rebuild the source code only when needed

# This is where because may be the case that you would try

# to build the app based on some `X_TAG` in my case (Git commit hash)

# but the code hasn't changed.

FROM node:16-alpine AS builder

ENV NODE_ENV=production
WORKDIR /opt/app
COPY . .
COPY --from=deps /opt/app/node_modules ./node_modules
RUN yarn build

# Production image, copy all the files and run next

FROM node:16-alpine AS runner

ARG X_TAG
WORKDIR /opt/app
ENV NODE_ENV=production
COPY --from=builder /opt/app/next.config.js ./
COPY --from=builder /opt/app/public ./public
COPY --from=builder /opt/app/.next ./.next
COPY --from=builder /opt/app/node_modules ./node_modules
CMD ["node_modules/.bin/next", "start"]

文件夹结构

我试过在构建步骤之前使用Dockerfile中的COPY命令将包内容复制到/opt/app文件夹中,这样就可以解析它们。但是,我不确定我是否做对了,一直没有结果。

s3fp2yjn

s3fp2yjn1#

你当然可以找到一种方法,使您的应用程序工作,而不改变目录结构,但我不认为你应该。
模块导入的import关键字应属于以下两类之一:

*应用程序代码,位于源文件夹中
*依赖项通常位于node_modules文件夹中

如果您希望将多个软件包放入一个存储库中,则应查看monorepo pattern
由于您使用的是yarn,因此可以查看Yarn提供的构建monorepo的解决方案Yarn Workspace
您可能需要将目录结构稍微更改为如下所示的结构:

├── app
│   ├── src
│   └── package.json       (next.js)
├── packages
│   ├── custom-package-1
│   │   ├── src
│   │   └── package.json
│   └── custom-package-2
│       ├── src
│       └── package.json
└── package.json            (main)

package.json中,您将把custom-package-1添加到您的dependencies中,并且您的monorepo工具将神奇的把custom-package-1包含在您的依赖项中(主要是通过创建一些符号链接)。

相关问题