前言
現在的前端項目一般都是類似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代理解決