docker入门-Git和容器-CICD
什么是Github Actions以及如何使用
1. Dockerhub镜像构建的自动化
假设要对dockerhub中自己的镜像进行更新:
- 修改构建镜像的dockerfile以及相关代码
- 手动在本地进行build
- 手动push到dockerhub
每次需要手动去输入这些命令十分的麻烦,dockerhub中是支持自动化构建的:
假设镜像的文件已经上传到github中,使用dockerhub的自动化构建功能将该镜像关联到自己的github中相应镜像的仓库。如果该仓库的代码发生了改变,在dockerhub中的镜像重新构建在并替代原来的镜像。但是存在一个问题:在dockerhub中自动化构建后只支持linux/amd64的架构
2. Github Actions
2.1 什么是Github Actions
它是一个持续集成和持续部署的工具,通过workflow实现
workflow是通过git相关操作去触发(比如push等),进而实现镜像的构建、测试、服务部署等操作,即需要通过脚本实现的操作都可以通过workflow实现
定义workflow需要通过一个yml文件去定义
自动化构建和提交镜像:
- 服务部署:
2.2 Github Actions初体验
在参考1中有一个
GitHub Actions: Hello World
课程,可以根据该课程入门GitHub Actions的使用
- 在Github中创建一个仓库,包含下列文件:
- docker-compose.yml:
version: "3.8" services: flask: build: context: ./ dockerfile: Dockerfile image: pshijie/flask-redis:latest ports: - "8080:5000" environment: - REDIS_HOST=redis-server - REDIS_PASS=${REDIS_PASSWORD} redis-server: image: redis:latest command: redis-server --requirepass ${REDIS_PASSWORD}
- Dockerfile:
FROM python:3-slim RUN pip install flask redis && \ groupadd -r flask && useradd -r -g flask flask && \ mkdir /src && \ chown -R flask:flask /src USER flask COPY app.py /src/app.py WORKDIR /src ENV FLASK=app.py EXPOSE 5000 CMD ["flask", "run", "-h", "0.0.0.0"]
- app.py:
from flask import Flask from redis import StrictRedis import os import socket # test app = Flask(__name__) redis = StrictRedis(host=os.environ.get('REDIS_HOST', '127.0.0.1'), port=6379, password=os.environ.get('REDIS_PASS', 'redis')) @app.route('/') def hello(): redis.incr('hits') return f"Hello Container World! I have been seen {redis.get('hits').decode('utf-8')} times and my hostname is {socket.gethostname()}.\n"
其中,在目录
.github/workflows/
下的docker-build.yml
文件如下:name: Docker image buildx and push on: [push] jobs: Docker-Build-Push: runs-on: ubuntu-latest # 表示工作会跑在ubuntu机器中 steps: - name: Checkout uses: actions/checkout@v2 # 该步GitHub已经定义好,表示将代码克隆到ubuntu机器中 - name: docker image build run: docker build -t pshijie/flask-reids:latest . - name: list docker image run: docker image ls
将上述代码提交到该仓库后,点击action:
会看到所有workflow,点击其中一个进去:
2.3 Github Actions实现镜像的构建和提交
- 将2.2节的镜像提交到dockerhub,修改
docker-build.yml
文件:steps: - name: dockerhub login run: docker login -u xxx -p xxx
如果直接把用户名和密码写在文件中很不安全,可以在github的setting中找到Secrets设置键值对:
在设置
DOCKERHUB_PASSWORD
可以设置为在dockerhub获取的token替代密码:
- 设置好键值对后,修改
docker-build.yml
文件:steps: - name: dockerhub login run: docker login -u ${{secrets.DOCKERHUB_USERNAME}} -p ${{secrets.DOCKERHUB_PASSWORD}} - name: push to dockerhub run: docker image push pshijie/flask-reids:latest
- 在github对应仓库进行commit操作后,Github Actions开始执行脚本操作:
2.4 Github Actions实现buildx
在2.3节中上传到dockerhub的镜像仅支持Linux/amd64架构,要实现多架构支持,是不是直接在
docker-build.yml
文件将构建镜像部分代码改为Docker的多架构支持中命令即可???:
docker buildx create --name mybuilder --use
docker buildx build --push --platform linux/arm/v7,linux/arm64/v8,linux/amd64 -t pshijie/flask-redis:2.0 .
但是Github Actions执行脚本操作时会报错,因为缺少
QEMU
模拟器。此时可以在github的Marketplace中找到Docker Setup Buildx
需要的脚本命令:
- 修改后的
docker-build.yml
文件如下:steps: - name: Checkout uses: actions/checkout@v2 # 该步GitHub已经定义好,表示将代码克隆到ubuntu机器中 - name: Set up QEMU uses: docker/setup-qemu-action@v1 - name: Set up Docker Buildx id: buildx uses: docker/setup-buildx-action@v1 - name: Available platforms run: echo ${{ steps.buildx.outputs.platforms }} - name: build and push run: | docker login -u ${{secrets.DOCKERHUB_USERNAME}} -p ${{secrets.DOCKERHUB_PASSWORD}} docker buildx ls docker buildx build --push --platform linux/arm/v7,linux/arm64/v8,linux/amd64 -t pshijie/flask-redis:2.0 .
- 在github仓库commit后,在dockerhub中新的镜像就是支持多架构的了:
2.5 改造buildx workflow
在2.4节中的脚本可以使用Marketplace中已有的actions进行修改:
steps: - name: Checkout uses: actions/checkout@v2 # 该步GitHub已经定义好,表示将代码克隆到ubuntu机器中 - name: Set up QEMU uses: docker/setup-qemu-action@v1 - name: Set up Docker Buildx id: buildx uses: docker/setup-buildx-action@v1 - name: Login to Dockerhub uses: docker/login-action@v1 with: username: ${{secrets.DOCKERHUB_USERNAME}} password: ${{secrets.DOCKERHUB_PASSWORD}} - name: Build and push id: docker_build uses: docker/build-push-action@v2 with: push: true platforms: linux/amd64,linux/arm64 tags: pshijie/flask-redis:3.0
3. 参考
- [https://lab.github.com/githubtraining/github-actions:-hello-world
- https://dockertips.readthedocs.io/en/latest/docker-cicd.html
更多推荐
所有评论(0)