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. 参考

  1. [https://lab.github.com/githubtraining/github-actions:-hello-world
  2. https://dockertips.readthedocs.io/en/latest/docker-cicd.html
Logo

瓜分20万奖金 获得内推名额 丰厚实物奖励 易参与易上手

更多推荐