接上一篇hexo博客docker部署阿里云的一点心得 之后,第二次上传文章的时候发现,从dockerhub仓库拉取自己的镜像非常慢,而且基本都是timeout拉不下来,尝试改镜像源什么的没啥效果。
在修改镜像源的过程中发现了阿里云容器镜像服务,发现它个人版还是免费的,经测试,拉取镜像速度很快,于是就用上了它。
又想到,每次发文章都要push代码,然后登陆ecs再用docker pull下来,然后再run起来.......是不是太麻烦了,是不是可以一步到位,只要push完代码就行了,其他的交给git action。
自己在本地登录ecs是需要输入密码的,在gitaction上是通过脚本执行,怎么做呢?在网上找了后发现也有教程案例,那就是使用ssh密钥来登陆ecs,然后执行登陆后的操作。
登陆阿里云,搜索容器镜像服务,创建一个个人版镜像仓库,记住命名空间和仓库名称,选择类型时选择公开。
仓库管理--访问凭证设置一个固定密码。
至此,这里需要用到:
登陆可以使用密码登陆,也可以使用ssh密钥登陆,为了安全,使用ssh密钥。
mkdir -p ~/.ssh && cd ~/.ssh
ssh-keygen -t rsa
cat id_rsa.pub >> authorized_keys
chmod 600 authorized_keys
chmod 700 ~/.ssh
# 编辑 /etc/ssh/sshd_config 文件,进行如下设置
RSAAuthentication yes
PubkeyAuthentication yes
后面两步验证即可,后面也是查了才知道,默认情况下都是正确的。
查看私钥文件,复制备用。
在github上打开项目目录,Settings -> Secrets -> actions,添加好需要用到的参数:
actions中新建一个action动作,选择nodejs模版,然后编写内容:
# deploy.yml
name: deploy blog to dockerhub
on:
push:
branches:
- hexo # 上传到此分支触发
jobs:
build:
runs-on: ubuntu-latest
steps:
# 检查代码
- name: Checkout # 将仓库内master分支的内容下载到工作目录
uses: actions/checkout@v2 # 脚本来自 https://github.com/actions/checkout
# 发布
- name: Login to Aliyun Container Registry (ACR)
uses: aliyun/acr-login@v1 # 使用阿里云镜像服务action
with:
login-server: registry.cn-shenzhen.aliyuncs.com # 务必正确填写镜像容器服务的登录地址
region-id: cn-shenzhen # 务必正确填写镜像容器服务的登录地址
username: "${{ secrets.REGISTRY_USERNAME }}" # 引用GitHub repo设置的镜像容器服务用户名
password: "${{ secrets.REGISTRY_PASSWORD }}" # 引用GitHub repo设置的镜像容器服务密码
- name: Build and Push Docker Image
env:
app_name: "my-blog"
app_space: "maya1900"
app_url: "registry.cn-shenzhen.aliyuncs.com"
run: |
docker build -t $app_url/$app_space/$app_name:latest .
docker push $app_url/$app_space/$app_name:latest
# 部署
- name: Login aliEcs
uses: appleboy/ssh-action@master
env:
app_name: "my-blog"
app_space: "maya1900"
app_url: "registry.cn-shenzhen.aliyuncs.com"
with:
host: ${{ secrets.SERVER_HOST }}
username: ${{ secrets.SERVER_USER }}
key: ${{ secrets.SERVER_TOKEN }}
port: 22
script: |-
app_name="my-blog"
app_space="maya1900"
if test -n "$(docker ps -a |grep $app_name)"; then
echo "停止并且删除容器和上版本镜像"
docker stop $app_name
docker rm $app_name
docker rmi registry.cn-shenzhen.aliyuncs.com/$app_space/$app_name:latest
else
echo "未检查到$app_name容器运行"
fi
echo "获取最新的镜像"
docker pull registry.cn-shenzhen.aliyuncs.com/$app_space/$app_name:latest
echo "启动服务"
docker run --name $app_name -p 8082:80 -d registry.cn-shenzhen.aliyuncs.com/$app_space/$app_name:latest
保存后,action就应该第一次启动了(当然我试了n次才成功...)。
以后push完代码就可以等代码部署到网站了。(里面使用到的docker命令与上一篇文章有关,有兴趣可自行查看)
最后,感谢前辈们的无私分享,谢谢。
本文由 mdnice 多平台发布