webhooks + github + docker
docker使用
Dockerfile1
2
3
4
5
6
7
8
9
10
11
12
13FROM node:10-alpine
# 代表生产环境
ENV PROJECT_ENV production
# 许多 package 会根据此环境变量,做出不同的行为
# 另外,在 webpack 中打包也会根据此环境变量做出优化,但是 create-react-app 在打>包时会写死该环境变量
ENV NODE_ENV production
RUN mkdir /public
ADD . /public
WORKDIR /public
RUN npm install --production
CMD cd /public && echo 'watch file list' && ls && npm run dev
EXPOSE 8080root@mydani: ~/github/helloworld 19:26:50
FROM
: 依赖的镜像imageENV
: 环境变量RUN
: 运行docker build
时执行的命令。每一个RUN
都会在image上加一层。所以RUN越少越好。如:RUN cd /public RUN npm install
=>RUN cd /public && npm install
CMD
: 运行docker run
时执行的命令。一个Dockerfile只能有一个CMD
github的webhooks
配置
payloadURL: 用户git操作时,向此接口推送数据。
webhooks
服务器接口内容1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40var express = require('express');
var bodyParser = require('body-parser');
var app = express();
let {exec} = require('child_process');
app.use(bodyParser.urlencoded({extended: false}));
var hostName = '127.0.0.1';
var port = 80;
app.post('/post', function(req, res) {
// console.log('请求参数:', req.body);
var data = null;
try{
data = JSON.parse(req.body.payload)
} catch(error) {
}
if(data && data.repository.name === 'helloworld') {
exec(
'cd ~/github/helloworld && git pull origin master && source ~/server/webhook/deploy.sh',
function(err, stdout, stderr) {
if (err) {
console.log(err)
res.send(err);
}
console.log(stdout);
res.send(stdout);
}
);
}else{
res.send('webhook refused')
}
});
app.get('/webhook', function (req, res) {
console.log('get webhook');
res.sendFile( __dirname + "/" + "webhook.js" );
})
app.listen(port, function() {
console.log(`服务运行在http://${hostName}:${port}`);
});
其中~/server/webhook/deploy.sh
给container取名就能通过name来stop和rm container1
2
3
4
5#!/bin/sh
docker stop core && docker rm core
docker build -t core .
docker run -itd -p 8080:8080 --name="core" core
到此,向github上push代码就触发webhooks,推送给服务器接口,接口接受到内容,告诉docker重新生成发布服务。
其他
node server.js
运行接口文件的话,会依赖终端占用,如果终端关闭,接口就被取消掉了。这个问题可以用forever代替。1
2
3
4
5
6
7
8
9
10
111、安装forever
npm install forever-g
2、用forever开启node程序
forever start xxx.js --port 8000
3、关闭node程序
forever stop xxx.js
docker删除所有未使用image1
2
3docker image prune -a
docker image prune -a -f #-f强制,不需要确认
docker删除未运行的container1
2
3
4
5
6
7
8(1) 删除所有未运行的容器;运行的删除不了
docker rm $(docker ps -a -q)
(2) 根据容器的状态删除状态为Exited的容器
docker rm $(docker ps -qf status=exited)
(3) docker 1.13版本以后,可以使用docker container prune删除孤立的容器
docker container prune