前言
现在的前端项目一般都是类似node app.js
运行起来的,也就是说它需要一个node环境来提供web服务,另一种是生成最终的静态文件,用nginx提供服务
上面两种方式做成镜像有点大,所以这里的思路是用golang写一个静态文件服务器,做成基础镜像,node项目生成的静态文件和它一起打包即可运行起来提供服务
golang写一个http静态服务器
main.go
package main
import (
"flag"
"log"
"net/http"
"os"
"strings"
)
var (
root string
port string
)
func init() {
flag.StringVar(&root, "path", "", "file root path")
flag.StringVar(&port, "port", "80", "listen port, default 80")
}
func main() {
flag.Parse()
if exist, _ := PathExist(root); false == exist {
log.Fatalf("root path: %s is not exist\n", root)
}
port = strings.Trim(port, ":")
http.Handle("/", http.FileServer(http.Dir(root)))
log.Printf("file root dir: %s, listen port: %s\n", root, port)
err := http.ListenAndServe(":"+port, nil)
if err != nil {
log.Fatal(err)
}
}
func PathExist(path string) (bool, error) {
_, err := os.Stat(path)
if err == nil {
return true, nil
}
if os.IsNotExist(err) {
return false, nil
}
return false, err
}
编译生成名字叫http的可执行文件:
export CGO_ENABLED=0
go build -o http
chmod u+x http
# 例子
./http -path /data/www -port 8080
Dockerfile
FROM alpine:3.10
LABEL description="simple http server"
COPY http /bin/http
WORKDIR /app
CMD http -v
打包成docker镜像
docker build -t http:v1 .
node项目打包
假设端口为9090
第一种:把node环境和项目一起打包(可用于开发测试)
缺点是生成的镜像太大了
Dockerfile
FROM node:10.16-alpine
LABEL description="test image"
ADD . /app/
WORKDIR /app
RUN yarn install --registry https://registry.npm.taobao.org
EXPOSE 9090
CMD ["yarn", "start"]
第二种: 把生成的静态文件和golang写的http服务打包(可用于生产)
Dockerfile
FROM node:10.16-alpine as builder
WORKDIR /build
ADD . .
# 生成dist目录,里面是静态文件
RUN yarn install --registry https://registry.npm.taobao.org && yarn run build
FROM http:v1 as runner
LABEL description="test image "
COPY --from=builder /build/dist /app
WORKDIR /app
EXPOSE 9090
CMD http -path /app -port 9090
打包和运行
image=test:v1
docker build -t $image .
docker run -d --name=test -p 9090:9090 $image
访问localhost:9090
即可访问该项目了
自动化打包部署
注意
关于缓存,限速等问题可用nginx代理解决