让我们使用Gatsby创建一个网站,并学习如何使用nginx在Docker容器中为其服务。
首先,让我们初始化一个新的Gatsby应用程序。
npm init gatsby
请随意接受默认设置,除了我们将应用程序命名为gatsby-nginx-docker 。
一旦应用程序被设置好,导航到新的应用程序目录。
cd gatsby-nginx-docker
为了使用Docker,我们需要几个文件:一个是Dockerfile ,用来列出组装镜像的说明;一个是.dockerignore ,用来在Docker构建过程中忽略文件。现在让我们来制作这些文件。
touch Dockerfile
对于我们的.dockerignore 文件,让我们确保在node_modules 中忽略我们的依赖文件,就像我们用git一样。
echo "node_modules" > .dockerignore
构建Docker文件
是时候建立Docker文件了!我们可以用很多方法来建立Docker文件。我们有很多方法可以做到这一点,但今天我们将使用一个多阶段的过程。
- 阶段1:用于构建前端资产的Node镜像
- 阶段2:nginx阶段,为前端资产提供服务
第一阶段:构建前端资产
我们的第一个阶段将
- 使用一个节点镜像
- 将我们所有的Gatsby文件复制到一个工作目录中
- 用yarn安装项目的依赖性
- 用yarn构建应用程序
这就是在Docker中的样子!
# Name the node stage "builder"
FROM node:14 AS builder
# Set working directory
WORKDIR /app
# Copy all files from current directory to working dir in image
COPY . .
# install node modules and build assets
RUN yarn install && yarn build
接下来,我们实际上是在为我们刚刚建立的内容提供服务!
第二阶段:我们的nginx服务器
我们的第二个阶段将。
- 使用一个nginx镜像
- 从nginx镜像中删除任何默认的静态资产
- 从我们在第一阶段创建的
builder镜像中复制我们的静态资产 - 为我们的容器指定运行nginx的入口。
下面是这个阶段在Docker文件中的样子。
# nginx state for serving content
FROM nginx:alpine
# Set working directory to nginx asset directory
WORKDIR /usr/share/nginx/html
# Remove default nginx static assets
RUN rm -rf ./*
# Copy static assets from builder stage
COPY --from=builder /app/public .
# Containers run nginx with global directives and daemon off
ENTRYPOINT ["nginx", "-g", "daemon off;"]
重要的是,Gatsby默认将静态资产构建到public ,所以我们从那里复制我们的文件。如果你的应用程序由于某种原因将文件建在另一个文件夹中,请做相应调整。
把它放在一起
好了!让我们把这一切放在一起。让我们把这一切放在一起并运行我们的应用程序。
我们的多阶段Docker文件现在应该是这样的。
# Multi-stage
# 1) Node image for building frontend assets
# 2) nginx stage to serve frontend assets
# Name the node stage "builder"
FROM node:14 AS builder
# Set working directory
WORKDIR /app
# Copy all files from current directory to working dir in image
COPY . .
# install node modules and build assets
RUN yarn install && yarn build
# nginx state for serving content
FROM nginx:alpine
# Set working directory to nginx asset directory
WORKDIR /usr/share/nginx/html
# Remove default nginx static assets
RUN rm -rf ./*
# Copy static assets from builder stage
COPY --from=builder /app/public .
# Containers run nginx with global directives and daemon off
ENTRYPOINT ["nginx", "-g", "daemon off;"]
现在我们已经组装好了我们的Docker文件,让我们建立一个名为gatsby-nginx 的镜像。
docker build -t gatsby-nginx .
现在我们的镜像已经建成,我们可以用下面的命令启动一个容器,它将在8080端口为我们的应用程序提供服务。
docker run --rm -it -p 8080:80 gatsby-nginx
导航到http://localhost:8080,你现在应该看到我们默认的Gatsby应用程序了