Nuxt 构建因 docker 容器内的权限错误而失败
Nuxt build fails with permission error inside docker container
我正在尝试通过关注 this guide 来 docker 化我的 Nuxt 应用程序。如果我输入写在那里的命令它会起作用,但我想使用 docker-compose
来简化它。我还在学习 docker。
到目前为止,我已经创建了一个 docker-compose.yml
文件
version: '3'
services:
nuxt-app:
container_name: nuxt-app
build:
context: .
dockerfile: Dockerfile
volumes:
- '.:/app'
- '/app/node_modules'
ports:
- '3000:3000'
但是当我 运行 docker-compose up
时,它显示了这个错误
[+] Running 2/2
⠿ Network nuxt-app_default Created 0.7s
⠿ Container nuxt-app Created 30.3s
Attaching to nuxt-app
nuxt-app | yarn run v1.22.17
nuxt-app | $ nuxt start
nuxt-app |
nuxt-app | FATAL No build files found in /app/.nuxt/dist/server.
nuxt-app | Use either `nuxt build` or `builder.build()` or start nuxt in development mode.
nuxt-app |
nuxt-app | Use either `nuxt build` or `builder.build()` or start nuxt in development mode.
nuxt-app | at VueRenderer._ready (node_modules/@nuxt/vue-renderer/dist/vue-renderer.js:758:13)
nuxt-app | at async Server.ready (node_modules/@nuxt/server/dist/server.js:637:5)
nuxt-app | at async Nuxt._init (node_modules/@nuxt/core/dist/core.js:482:7)
nuxt-app |
nuxt-app |
nuxt-app |
╭──────────────────────────────────────────────────────────────────────────────╮
│ │
│ ✖ Nuxt Fatal Error │
│ │
│ Error: No build files found in /app/.nuxt/dist/server. │
│ Use either `nuxt build` or `builder.build()` or start nuxt in │
│ development mode. │
│ │
╰──────────────────────────────────────────────────────────────────────────────╯
nuxt-app |
nuxt-app | error Command failed with exit code 1.
nuxt-app | info Visit https://yarnpkg.com/en/docs/cli/run for documentation about this command.
nuxt-app exited with code 1
我的Dockerfile
看起来像这样
FROM node:lts as builder
WORKDIR /app
COPY . .
RUN yarn install \
--prefer-offline \
--frozen-lockfile \
--non-interactive \
--production=false
RUN yarn build
RUN rm -rf node_modules && \
NODE_ENV=production yarn install \
--prefer-offline \
--pure-lockfile \
--non-interactive \
--production=true
FROM node:lts
WORKDIR /app
COPY --from=builder /app .
ENV HOST 0.0.0.0
EXPOSE 80
CMD [ "yarn", "start" ]
有人能告诉我为什么会这样吗?我怎样才能让它起作用?
更新
如果我在 docker-compose up
之前执行 yarn build
,问题似乎可以解决
volumes:
安装隐藏了 Dockerfile 所做的一切。在构建应用程序并围绕它创建一个最小图像之后,您可以挂载您的主机目录并使所有这些目录不可见。这也是 运行 yarn build
在本地似乎有帮助的原因:它会在将 Dockerfile 安装到容器之前重新创建您的 Dockerfile 在主机上构建的目录。
您可以将 docker-compose.yml
减少到
version: '3.8'
services:
nuxt-app:
build: .
ports:
- '3000:3000'
没有 volumes:
并且没有覆盖 container_name:
Compose 提供的内容,并使用更短的 build:
形式,因为否则您将使用默认选项。
我正在尝试通过关注 this guide 来 docker 化我的 Nuxt 应用程序。如果我输入写在那里的命令它会起作用,但我想使用 docker-compose
来简化它。我还在学习 docker。
到目前为止,我已经创建了一个 docker-compose.yml
文件
version: '3'
services:
nuxt-app:
container_name: nuxt-app
build:
context: .
dockerfile: Dockerfile
volumes:
- '.:/app'
- '/app/node_modules'
ports:
- '3000:3000'
但是当我 运行 docker-compose up
时,它显示了这个错误
[+] Running 2/2
⠿ Network nuxt-app_default Created 0.7s
⠿ Container nuxt-app Created 30.3s
Attaching to nuxt-app
nuxt-app | yarn run v1.22.17
nuxt-app | $ nuxt start
nuxt-app |
nuxt-app | FATAL No build files found in /app/.nuxt/dist/server.
nuxt-app | Use either `nuxt build` or `builder.build()` or start nuxt in development mode.
nuxt-app |
nuxt-app | Use either `nuxt build` or `builder.build()` or start nuxt in development mode.
nuxt-app | at VueRenderer._ready (node_modules/@nuxt/vue-renderer/dist/vue-renderer.js:758:13)
nuxt-app | at async Server.ready (node_modules/@nuxt/server/dist/server.js:637:5)
nuxt-app | at async Nuxt._init (node_modules/@nuxt/core/dist/core.js:482:7)
nuxt-app |
nuxt-app |
nuxt-app |
╭──────────────────────────────────────────────────────────────────────────────╮
│ │
│ ✖ Nuxt Fatal Error │
│ │
│ Error: No build files found in /app/.nuxt/dist/server. │
│ Use either `nuxt build` or `builder.build()` or start nuxt in │
│ development mode. │
│ │
╰──────────────────────────────────────────────────────────────────────────────╯
nuxt-app |
nuxt-app | error Command failed with exit code 1.
nuxt-app | info Visit https://yarnpkg.com/en/docs/cli/run for documentation about this command.
nuxt-app exited with code 1
我的Dockerfile
看起来像这样
FROM node:lts as builder
WORKDIR /app
COPY . .
RUN yarn install \
--prefer-offline \
--frozen-lockfile \
--non-interactive \
--production=false
RUN yarn build
RUN rm -rf node_modules && \
NODE_ENV=production yarn install \
--prefer-offline \
--pure-lockfile \
--non-interactive \
--production=true
FROM node:lts
WORKDIR /app
COPY --from=builder /app .
ENV HOST 0.0.0.0
EXPOSE 80
CMD [ "yarn", "start" ]
有人能告诉我为什么会这样吗?我怎样才能让它起作用?
更新
如果我在 docker-compose up
yarn build
,问题似乎可以解决
volumes:
安装隐藏了 Dockerfile 所做的一切。在构建应用程序并围绕它创建一个最小图像之后,您可以挂载您的主机目录并使所有这些目录不可见。这也是 运行 yarn build
在本地似乎有帮助的原因:它会在将 Dockerfile 安装到容器之前重新创建您的 Dockerfile 在主机上构建的目录。
您可以将 docker-compose.yml
减少到
version: '3.8'
services:
nuxt-app:
build: .
ports:
- '3000:3000'
没有 volumes:
并且没有覆盖 container_name:
Compose 提供的内容,并使用更短的 build:
形式,因为否则您将使用默认选项。