作者:matrix
发布时间:2024-07-06
分类:Golang Linux
在构建GO的docker镜像时,都需要安装很多开发环境和依赖包,如果正常打包完整环境为镜像完全没有必要。因为运行时只需要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镜像。
作者:matrix
发布时间:2023-06-23
分类:零零星星
https://github.com/Hootrix/keyword_alert_bot
针对keyword_alert_bot
项目早就有添加docker镜像的想法,这次趁着有机会就完成这个feature,也算是使用下GitHub的CI/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配置
填写你的docker hub的对应值。
${{ 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
作者: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