# 所使用的基础组件
代码托管在 Github 上,使用 github 集成的 Travis CI 自动触发 CI 流程。在 CI 中自动 build 新的 image 上传到 Docker Hub。然后通过 sshpass 远程登录 server 触发部署脚本。部署脚本 pull 新的 image 然后部署。
# Dockerfile
由于项目都是基于 python 的,所以 dockerfile 比较简单:
FROM ubuntu:latest | |
MAINTAINER Shaobo Liu <shaobo@mkdef.com> | |
LABEL Description="This image is used to flask-kraken" | |
RUN apt-get update -y | |
RUN apt-get install -y python3-pip python3-dev build-essential | |
COPY src /app | |
COPY requirements.txt /app | |
WORKDIR /app | |
RUN pip3 install -r requirements.txt | |
ENTRYPOINT ["python3"] | |
CMD ["app.py"] |
分解一下:
FROM ubuntu:latest | |
MAINTAINER Shaobo Liu <shaobo@mkdef.com> | |
LABEL Description="This image is used to flask-kraken" |
首先申明使用的基础镜像,然后写上大名表示我是维护这个镜像的作者和这个镜像的用途。
RUN apt-get update -y | |
RUN apt-get install -y python3-pip python3-dev build-essential |
安装 python3,如果有其他的工具或者 lib,也要写在这里。
COPY src /app | |
COPY requirements.txt /app | |
WORKDIR /app | |
RUN pip3 install -r requirements.txt |
复制源代码到 docker 里,然后切换工作目录,安装三方依赖。 有时候这里需要安装一些系统级的依赖,比如 lxml 或者 psycopg2 之类的,就需要加到前面 apt-get install
里去。
ENTRYPOINT ["python3"] | |
CMD ["app.py"] |
最后是需要执行的命令。根据 docker 的 userguide,一个 image 最好只干一件事。
# Travis CI
在项目根目录添加 .travis.yml
来定义 CI 流程
sudo: required | |
language: python | |
services: | |
- docker | |
python: | |
- "3.5" | |
before_install: | |
- sudo apt-get update | |
- sudo apt-get install sshpass | |
install: "pip install -r requirements.txt" | |
script: | |
- python --version | |
after_success: | |
- docker login -u="$DOCKER_USERNAME" -p="$DOCKER_PASSWORD" | |
- docker build -t shaobol/kraken:$TRAVIS_BRANCH-$TRAVIS_BUILD_ID . | |
- docker push shaobol/kraken:$TRAVIS_BRANCH-$TRAVIS_BUILD_ID; | |
- sshpass -p $VPS_PASSWORD ssh -o stricthostkeychecking=no root@45.32.137.234 "sudo /home/saukymo/kraken/deploy.sh $TRAVIS_BRANCH-$TRAVIS_BUILD_ID" |
这里就不一一分解了,具体可以参考 Travis 的官方文档。
主要介绍一下这个部分和其他部分是怎么联动的。首先 Travis 和 Github 是有集成服务的,在 Setting -> integrations & services
里选择添加 Travis 就可以了。然后在 Travis 上就可以设置相应的 CI 流程了,默认是 master 有新的 commit 就会自动触发一次 CI。
每次 CI 结束后的结果可以通过 badge 查看。
重点在于测试完成后 build 和 push docker image 的过程
after_success: | |
- docker login -u="$DOCKER_USERNAME" -p="$DOCKER_PASSWORD" | |
- docker build -t shaobol/kraken:$TRAVIS_BRANCH-$TRAVIS_BUILD_ID . | |
- docker push shaobol/kraken:$TRAVIS_BRANCH-$TRAVIS_BUILD_ID; |
敏感信息这里全部通过 Travis 的 Environment Variables。这样可以避免因为公开而泄露。
如果需要将一些敏感信息传递到 image 里面去,可以通过 --build-arg
参数传递进去,然后保存为环境变量,参考 reference
最后通过 sshpass
执行部署脚本,这一步也可以使用 ansible
代替。
# docker 部署脚本
#!/bin/bash | |
docker pull shaobol/odes:$1 | |
if docker ps -a | grep -q odes; then | |
docker rm -f odes | |
fi | |
docker run -d --name odes -p 9000:9000 --link postgres:postgres shaobol/odes:$1 |
脚本很简单,接收 CI 传过来的参数 (image tag),pull 新的 image,然后干掉之前的 container,run 一个新的。这样就完成了 update 整个过程。