1

我有一个使用 gridsome 构建的静态网站,我正在尝试使用 docker 容器化,并提出了以下 Dockerfile:

FROM node:14.2.0-alpine3.10

RUN apk update && apk upgrade
RUN apk --no-cache add git g++ gcc libgcc libstdc++ linux-headers make python yarn

ENV NPM_CONFIG_PREFIX=/home/node/.npm-global
USER node
RUN npm i --global gridsome
RUN yarn global add serve

COPY --chown=node:node gridsome-website/ /home/node/build/
RUN echo && ls /home/node/build/ && echo
WORKDIR /home/node/build
USER node
RUN npm cache clean --force
RUN npm clean-install

# My attempt to serve the website from within, build is successful but serve command doesn't work
CMD ~/.npm-global/bin/gridsome build && serve -d dist/  

在通过以下方式运行容器后,Gridsome 默认使用端口 8080:

docker run --name my-website -d my-website-image

它没有失败,但我无法使用链接访问我的网站:http://localhost:8080,容器在我运行后立即停止执行。我尝试通过以下方式从容器中复制 ``` dist/`` 文件夹:

$ docker cp my-website:/home/node/build/dist ./dist

然后使用以下命令从终端手动提供:

$ serve -d dist/

它从终端工作,但为什么它在容器内失败?

4

1 回答 1

1

Gridsome 的重点在于它生成了一个静态站点,您可以将其托管在可以放置文件的任何位置,对吗?您不需要 nodejs 或任何东西,除了一个简单的网络服务器来托管它。

如果您想生成一个干净的生产 Docker 映像来服务由 Gridsome 构建的静态文件,那么这对于多级 Dockerfile 来说是一个很好的用例。在第一阶段,您将构建您的 Gridsome 项目。在第二个也是最后一个阶段,您可以使用nginx包含您的dist文件夹的干净图像而不是其他任何内容。

它可以像这样简单:

FROM node:current AS builder
WORKDIR /build
COPY gridsome-website ./
RUN npm install && gridsome build

FROM nginx:stable
COPY --from=builder /build/dist /usr/share/nginx/html/
EXPOSE 80

使用 8080->80 端口映射构建并运行映像后,您可以通过http://127.0.0.1:8080访问您的站点。

docker build -t my-website-image .
docker run -p 8080:80 my-website-image

设置一个.dockerignore至少忽略node_modules.

$ cat .dockerignore
gridsome-website/node_modules
于 2020-05-24T20:18:30.407 回答