nodejs項目docker自動化

前言

現在的前端項目一般都是類似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即可訪問該項目了

自動化打包部署

結合CI/CD工具Drone,可參考這篇文章

注意

關於緩存,限速等問題可用nginx代理解決

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章