Dockerfile多阶段构建镜像

作者:matrix 发布时间:2024-07-06 分类:Golang Linux

在构建GOdocker镜像时,都需要安装很多开发环境和依赖包,如果正常打包完整环境为镜像完全没有必要。因为运行时只需要Golang打包的二进制文件,不需要完整 dev 环境。

dockerfile多阶段构建就可以完美解决,将构建和运行环境分开,可以最终镜像最小化。 😆 😆 爽~~

# 第一阶段:使用开发环境镜像进行构建,设置别名builder
FROM golang:1.22 AS builder

# 设置工作目录
WORKDIR /app

# 复制所有文件到工作目录
COPY . .

# 编译应用程序
RUN go build -o go-demo .

# 第二阶段:使用小体积的基础镜像 打包最终镜像
FROM alpine:latest

WORKDIR /app

# 从构建阶段复制编译好的可执行文件
COPY --from=builder /app/go-demo .

# 运行可执行文件
CMD ["./go-demo"]

这样就可以确保最终的镜像只包含运行应用所需的最小文件,镜像环境也只是基础的alpine镜像。

GitHub Action自动release发布版本 + docker镜像打包

作者:matrix 发布时间:2023-06-23 分类:零零星星

https://github.com/Hootrix/keyword_alert_bot

针对keyword_alert_bot项目早就有添加docker镜像的想法,这次趁着有机会就完成这个feature,也算是使用下GitHubCI/CD

我的想法是利用GitHub action功能,推送代码更新后自动打包docker镜像且安装所有依赖。打包的时候把最新版本号写入到代码中(当前日期作为版本号)。使用者把docker镜像pull后可以轻松运行整个bot。

流水线配置

项目的 .github/workflows/main.yml路径下新建文件:

name: CI/CD Pipeline

on:
  push:

    # 指定分支push操作触发流水线
    branches:
      # - dev.20230419 # debug
      - master

jobs:

  # 自定义job流水线名字
  build-and-push:

    # 指定运行环境 ubuntu最新版本
    runs-on: ubuntu-latest

    # 设计流水线阶段
    steps:

    # 名称
    - name: Check out code
      # 使用预先定义好的action。actions/checkout@v2 是 GitHub 官方提供,目的是将代码检出(checkout)到运行器上
      uses: actions/checkout@v2
      with: # 配置参数
        fetch-depth: 2 # 表示只获取最新的两个commit提交记录 

    # 设置python3.7环境
    - name: Set up Python 3.7
      uses: actions/setup-python@v3
      with:
        python-version: 3.7

    # 安装pipenv依赖管理
    - name: Install pipenv
      run: |
        python -m pip install --upgrade pip
        python -m pip install pipenv

    # 标记是否存在py文件的更新,用于后续docker镜像打包的判断
    - name: Check for file changes
      id: file_check
      run: |
        if git diff --name-only HEAD^ | grep -q ".py$"; then
          echo "::set-output name=updated::true"
        else
          echo "::set-output name=updated::false"
        fi

    # 安装项目依赖
    - name: Install dependencies and lock
      if: steps.file_check.outputs.updated == 'true'
      run: |
        pipenv install --dev
        pipenv lock

    # 设置最新版本号 如 20230520.91a4ca1
    - name: Create version file
      run: |
        COMMIT_ID=$(git rev-parse --short HEAD)
        # 写入版本信息到指定文件 
        echo "__version__ = '$(TZ='Asia/Shanghai' date +'%Y%m%d').$COMMIT_ID'" > utils/__version__.py


    # 登录DockerHub
    - name: Login to DockerHub
      uses: docker/login-action@v1 
      with:
        username: ${{ secrets.DOCKER_HUB_USERNAME }}
        password: ${{ secrets.DOCKER_HUB_ACCESS_TOKEN }}

    # 存在更新条件 则推送到指定docker镜像仓库 tag为latest
    - name: Build and push Docker image
      if: steps.file_check.outputs.updated == 'true'
      uses: docker/build-push-action@v2
      with:
        context: .
        push: true

        # 推送到指定仓库镜像地址
        tags: yha8897/keyword_alert_bot:latest

    # 使用gh命令创建github release 执行版本发布
    - name: Create release
      env:
        GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
      run: |
        # 读取指定文件的版本号。根据自己项目设置
        VERSION=$(python -c "from utils.__version__ import __version__; print(__version__)")
        echo $VERSION
        # 执行版本发布
        gh release create $VERSION

说明:

注意上面配置中的${{ secrets.DOCKER_HUB_USERNAME }},${{ secrets.DOCKER_HUB_ACCESS_TOKEN }} 表示github action自动读取环境变量中的DOCKER_HUB_USERNAME,DOCKER_HUB_ACCESS_TOKEN 即 docker hub的登录名和密码

DOCKER_HUB_ACCESS_TOKEN 需要自己生成>>,权限设置Read & Write即可。

之后打开github项目页面的settings >> Secrets and variables >> Actions >> New repository secret按钮

TOKEN配置

New repository secret

New repository secret

填写你的docker hub的对应值。

secret list

${{ secrets.GITHUB_TOKEN }} 属于特殊环境变量(GITHUB_开头的都算),会自动读取你账户运行的权限,不需要自己单独设置。

触发流水线

配置完成后,提交或者合入代码到上面👆「branches」指定的master分支就能自动出发CI/CD

触发流水线

docker镜像会自动推送

参考:

https://raw.githubusercontent.com/Hootrix/keyword_alert_bot/master/.github/workflows/main.yml

https://docs.github.com/zh/actions/using-workflows/using-github-cli-in-workflows

https://zhuanlan.zhihu.com/p/526696611

docker入门使用命令

作者:matrix 发布时间:2022-06-30 分类:Linux

目前docker在开发和生产环境中经常使用。就算不是RD,你在github中总会看到他的身影。很多程序的demo版本都有提供docker镜像,用起来真的很爽。完全看作轻量级别虚拟机。

详细教程最好是自己网上多寻,这里整理下自己经常用到的命令。

下载镜像

# 搜索线上就像
docker search centos 

# 下载到本地
docker pull centos 

创建容器

容器是基于镜像创建的

可以根据镜像运行一次性的容器,运行完成后会停止运行,不会被销毁

# 运行容器 如果没有则创建
docker run centos

# 创建同时运行 uname -a命令
docker run centos  uname -a

# 设定容器名称
docker run  --name haha centos

#创建后台运行的容器
docker run --name test --detach/-d centos ping baidu.com

# 创建ssh可交互的容器
docker run --interactive/-i --tty/-t --name ssh centos

docker run -it --name ssh centos

# 创建一次性容器 执行目录挂载。退出之后自行销毁
docker run  -it --rm  -v ~/localData/讯康/HealthExam_Standard/wwwroot/manager/web:/data/web yha8897/nodejs-demo /bin/bash


# vue一键打包docker
#命令没有bash,命令完成后docker会自行退出,里面的分号;也可以换成&&
docker run  -it --rm  -v ~/localData/讯康/HealthExam_Standard/wwwroot/manager/web:/data yha8897/nodejs-demo sh -c 'cd /data;npm run build'

说明:
--interactive 可交互
--tty 输出到终端
--detach 后台驻留

查看正在运行的容器


docker ps # 查看所有容器 docker ps -a/--all

查看容器日志

 docker logs [容器name 或者 ID] 

 # 显示容器输出 类似tail -f
 docker logs --follow  [容器name 或者 ID]
 docker logs -f  [容器name 或者 ID]
 docker logs -t -f --tail=100 [容器name 或者 ID] 

容器ID可以缩写 比如只写前面几个字符。

查看容器启动的进程信息

# 查看容器db1ce9d2a3d0启动的进程信息 

$ docker container top db1ce9d2a3d0

停止/重启/删除容器

# 停止
docker stop haha

# 重启
docker restart haha

# 删除
docker rm [容器name 或者 ID] 

使用临时容器


docker run --rm -it --name mysql_demo -v ~/Desktop/master-bin.000040:/tmp/master-bin.000040 -p 3308:3308 -e MYSQL_ALLOW_EMPTY_PASSWORD=true mysql:5.7 /bin/bash

清理容器

清理已经不使用(包含退出状态)的所有容器

$ docker system prune -f 

清理镜像

清理已经不使用的所有镜像

$ docker image prune -a