nodejs项目docker自动化

1 篇文章 0 订阅
1 篇文章 0 订阅

前言

现在的前端项目一般都是类似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代理解决

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值