偶尔会构建一些自己用的容器,之前一直用的是Docker
提供的构建服务,然而Docker
开始收费了,那只能另寻他法。
之所以不本地构建推送,是因为构建的时候经常因为网络问题,访问不了一些资源,所以就依赖外网的服务。
之前知道Github Action
可以做到这个事情,由于Docker
官方提供了相关服务,我对于实时性的需求不高,所以一般就将Dockerfile
推送到Github
就了事了。
如下图操作:
这里使用了手动构建,文件变更之后不会自动构建。
同时这里依赖Github
设置中的SECRET服务。
name: Publish Docker image
on:
workflow_dispatch:
jobs:
build:
runs-on: ubuntu-latest
steps:
- name: Check out the repo
uses: actions/checkout@v3
- name: Log in to Docker Hub
uses: docker/login-action@f054a8b539a109f9f41c372932f1ae047eff08c9
with:
username: ${{ secrets.DOCKER_USERNAME }}
password: ${{ secrets.DOCKER_PASSWORD }}
- name: Extract metadata (tags, labels) for Docker
id: meta
uses: docker/metadata-action@98669ae865ea3cffbcbaa878cf57c20bbf1c6c38
with:
images: imjcw/ssh-go
tags: latest
- name: Build and push Docker image
uses: docker/build-push-action@ad44023a93711e3deb337508980b4b5e9bcdc5dc
with:
context: .
push: true
tags: ${{ steps.meta.outputs.tags }}
labels: ${{ steps.meta.outputs.labels }}
进入Actions
操作界面,选择对应workflow
,点击执行。
这时候只需要等待构建成功,若出现失败,可以查看失败原因,然后重新构建。
吐槽一下阿里云的自动构建,不能访问外网,连golang
基本的都支持不了
这里以阿里云作为示例
容器镜像服务 -> 个人实例 -> 访问凭证 -> 设置固定密码(也可以通过临时密码获取,需要做的事情会复杂一点)
name: Publish Docker image 2 Aliyun
on:
workflow_dispatch:
jobs:
build:
runs-on: ubuntu-latest
steps:
- name: Check out the repo
uses: actions/checkout@v3
- name: Log in to Docker Hub
uses: docker/login-action@f054a8b539a109f9f41c372932f1ae047eff08c9
with:
registry: registry.cn-beijing.aliyuncs.com
username: ${{ secrets.ALIYUN_DOCKER_USERNAME }}
password: ${{ secrets.ALIYUN_DOCKER_PASSWORD }}
- name: Extract metadata (tags, labels) for Docker
id: meta
uses: docker/metadata-action@98669ae865ea3cffbcbaa878cf57c20bbf1c6c38
with:
images: registry.cn-beijing.aliyuncs.com/imjcw/ssh-go
tags: latest
- name: Build and push Docker image
uses: docker/build-push-action@ad44023a93711e3deb337508980b4b5e9bcdc5dc
with:
context: .
push: true
tags: ${{ steps.meta.outputs.tags }}
labels: ${{ steps.meta.outputs.labels }}
不演示了
使用Github Action
构建,是为了利用其可以正常访问外网的资源,使用阿里云镜像服务
是为了能够使用加速服务(Docker配置过相关镜像,效果不明显)。
虽然过程有点折腾,最后问题还是得到解决了。