我一直在尝试通过以下设置使用 docker、yarn 和工作区启动并运行一个简单的 Nuxt 3:
mkdir nuxt-app
cd nuxt-app
yarn init -p
仅使用默认值mkdir config
mkdir config/admin
config/admin
mkdir packages
npx nuxi init packages/admin
cd packages/admin
yarn init -p
目录是什么样的
./config
- admin
- Dockerfile
./packages
- admin
nuxt...
./packages.json
./.dockerignore
./docker-compose.yml
docker-compose.yml
version: '3.7'
services:
admin:
container_name: admin_app
command: yarn dev
stdin_open: true
tty: true
ports:
- 3030:3030
build:
dockerfile: Dockerfile
context: ./config/admin
volumes:
- "./packages/admin:/admin"
Docker文件
FROM node:lts-alpine
WORKDIR /admin
COPY ./package.json yarn.lock ./
RUN yarn install
RUN yarn admin:build
EXPOSE 8000
CMD [ "yarn", "serve" ]
package.json {root}
{
"name": "docker.nuxt",
"version": "1.0.0",
"private": true,
"workspaces": [
"packages/*"
],
"scripts": {
"admin": "yarn --cwd packages/admin dev",
"admin:build": "yarn --cwd packages/admin build"
}
}
然后当我运行
docker-compose up
时它会抛出错误admin_app| /bin/sh: nuxt: not found
。我一直无法找到解决方案。任何帮助都会对我第一次真正使用 docker 有很大帮助。
admin_app| /bin/sh: nuxt: not found
- 意味着您没有安装 yarn 依赖项简而言之,如果你想将 Dockerfile 存储在不同的位置,你需要在
dockerfile
属性中指定路径,而不是上下文。上下文用于定义“当前目录”的位置(从您复制package.json
和yarn.lock
的位置)。
我会假设你真正想要的是将源文件从
./packages/admin
复制到容器,然后构建你的应用程序。
docker-compose.yaml 示例:
version: '3.7'
services:
admin:
container_name: admin_app
command: yarn dev
stdin_open: true
tty: true
ports:
- "3030:3030"
build:
dockerfile: ./config/admin/Dockerfile
context: .
Dockerfile示例:
FROM node:lts-alpine AS builder
WORKDIR /admin
# Copy all files for build - ignore unused in .dockerignore
COPY ./packages/admin ./
RUN yarn install
RUN yarn build
EXPOSE 8000
CMD [ "yarn", "dev" ]
注意:这个 Dockerfile 只会构建没有 yarn 工作区的管理包。
如果你想在你的构建中使用工作区,你需要调整 docker 文件。创建多个图像(多阶段构建)会更容易 - 一个用于依赖项,第二个用于应用程序本身:
基本图像(依赖项):
构建图像: 0. 使用
FROM
你的基础图片
注意:您可以创建额外的 docker-compose.build.yaml 来构建一个项目。 官方文档
Dockerfile示例:
FROM node:lts-alpine AS dependencies
WORKDIR /app
# Copy files from project for dependencies install: (TODO)
# COPY ./ ./
RUN yarn install
# -----------------------------
# You can define that in different Dockerfile
# For that build the first path and tag it
# then replace dependencies with tagged image
FROM dependencies AS admin
WORKDIR /app
COPY ./packages/admin ./
RUN admin:build
EXPOSE 8000
CMD [ "yarn", "dev" ]