将python编写的网站制作成docker镜像并上传到Github Packages上

文章目录

  • 前言
  • Docker
    • 安装docker
      • 注意事项
    • 创建Dockerfile
      • 注意事项
    • 构建 Docker 镜像
    • 运行 Docker 镜像
  • 发布到Github Packages
    • 坑坑到位
      • 申请token的坑
      • docker登录的坑
      • 给镜像添加标签的坑
      • docker推送的坑
  • 在Github Packages上查看
  • 总结

前言

还记得上一篇《借助ChatGPT使用Python搭建一个工具网站》总结中我利用ChatGPT写了一个网站,最终它运行良好,就在昨天我看到了Github Packages,不久前刚刚使用了GitHub Actions,我发现Github在被微软收购后,并没有变的更“闭源”,之前广大网友还在调侃,最大的闭源软件公司收购了最大的开源平台,看来一切还在向好的方向发展,简单介绍下前面提到的这两个都是什么东西。

GitHub Actions 是一个Github原生的持续集成和部署的工作流组件。通俗来说就是Github免费给你提供虚拟主机,由你编写工作流脚本来进行源码的检出,编译,测试,和发布。类似的我们可以想象成Github给每个仓库都免费绑定了一个Jenkins服务,编写pipeline脚本即可进行源码的集成和发布。

GitHub Packages 是一个和每一个代码仓库关联的软件包仓库。通俗来说就是代码仓库中存放的是源码,软件包仓库中存放的是编译输出后的可以被各个语言生态的依赖管理工具直接依赖的lib,类似的我们熟知的有maven中央仓库和nmp仓库。

今天我们只看GitHub Packages这部分,并且将范围缩小到制作一个Docker镜像并上传到GitHub Packages,用来制作的项目就是前文中我们在ChatGPT辅助下编写的网站,本文只写流程,对于其中的概念不会过多解释,大家可以借助网络来解决概念性问题,但是我在完成目标过程中遇到的坑会列举出来,希望能帮助有相同经历的人,同时自己记录一下防止忘记。

Docker

既然要制作docker镜像,那先简单了解下docker是什么

Docker 使用 Google 公司推出的 Go 语言 进行开发实现,基于 Linux 内核的 cgroup,namespace,以及 OverlayFS 类的 Union FS 等技术,对进程进行封装隔离,属于 操作系统层面的虚拟化技术。由于隔离的进程独立于宿主和其它的隔离的进程,因此也称其为容器。最初实现是基于 LXC,从 0.7 版本以后开始去除 LXC,转而使用自行开发的 libcontainer,从 1.11 版本开始,则进一步演进为使用 runC 和 containerd

Docker 可以通过定制应用镜像来实现持续集成、持续交付、部署。开发人员可以通过 Dockerfile 来进行镜像构建,并结合 持续集成(Continuous Integration) 系统进行集成测试,而运维人员则可以直接在生产环境中快速部署该镜像,甚至结合 持续部署(Continuous Delivery/Deployment) 系统进行自动部署。而且使用 Dockerfile 使镜像构建透明化,不仅仅开发团队可以理解应用运行环境,也方便运维团队理解应用运行所需条件,帮助更好的生产环境中部署该镜像。

以上我只是摘抄了一部分,想要看更详细的解释请跳转至 《Docker 技术入门与实战》,总的来说就是能解决环境一致性问题,并且可以方便部署的,把你的软件及运行环境打个包,在目标机器上直接运行,最大程度的去除环境差异,被打成的这个包就是docker镜像,我们可以把这个镜像丢到“任何”一台机器上去执行,不用再操心安装繁琐的运行环境。

但是无论是制作docker镜像还是运行docker镜像都需要先安装docker环境,相当于它来做软件和机器之间的代理,是不是听起来像虚拟机,他俩常常被拿来比较,而docker更加轻量级,目前应用广泛,我们来列举下安装步骤,事先说明操作系统是Ubuntu20.04,项目是minimalist-tool-web,未特殊说明时则是在项目根目录下执行命令。

安装docker

  • 更新apt包列表

    sudo apt update
    
  • 安装依赖包,以允许apt通过HTTPS使用存储库

    sudo apt install -y apt-transport-https ca-certificates curl gnupg2 software-properties-common
    
  • 添加Docker的官方GPG密钥

    curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
    
  • 添加Docker的APT存储库

    sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
    
  • 再次更新apt包列表

    sudo apt update
    
  • 安装Docker

    sudo apt install -y docker-ce
    
  • 验证Docker是否安装成功:

    sudo docker --version
    

注意事项

  1. 添加GPG密钥的时候有可能报错 curl: (35) OpenSSL SSL_connect: SSL_ERROR_SYSCALL in connection to download.docker.com:443,相同命令多尝试几次就能看见 OK

  2. 我在 sudo apt update 的时候报错 Failed to fetch https://dl.google.com/linux/chrome/deb/dists/stable/InRelease The following signatures couldn't be verified because the public key is not available: NO_PUBKEY E88979FB9B30ACF2,通过执行 wget -q -O - https://dl.google.com/linux/linux_signing_key.pub | sudo apt-key add - 修复好的,不过这可能是个例,你们不一定遇到

创建Dockerfile

在项目根目录下创建一个名为 Dockerfile 的文件,并编写 Docker 镜像的构建指令,以下是一个示例的 Dockerfile 文件,它是在初始命令模板下精简而成,目的是缩小镜像大小,调整命令后镜像从1.1G缩小到65M

# 使用 Alpine Linux 作为基础镜像
FROM python:3.8-alpine

# 设置工作目录
WORKDIR /app

# 将当前目录下的所有文件复制到工作目录
COPY . .

# 安装项目依赖
RUN pip install --no-cache-dir -r requirements.txt

# 清理不必要的缓存
RUN rm -rf /var/cache/apk/*

# 暴露应用端口
EXPOSE 9206

# 运行应用
CMD ["python3", "main.py"]

注意事项

  • WORKDIR /app 是指镜像中的目录,在当前操作系统中可能并不存在
  • COPY . . 很奇怪的写法,但是两个.含义是不同的,第一个只当前目录,第二个指镜像中的当前目录,也就是 /app

构建 Docker 镜像

$ sudo docker build -t minimalist-tool-web .

其中 -t minimalist-tool-web 指定了镜像的名称为 minimalist-tool-web,构建完成后,可以查看当前镜像

$ sudo docker images
REPOSITORY            TAG       IMAGE ID       CREATED          SIZE
minimalist-web-tool   latest    f11497961379   5 minutes ago    65.6MB
hello-world           latest    d2c94e258dcb   10 months ago    13.3kB

运行 Docker 镜像

docker run -d -p 9206:9205 minimalist-tool-web

其中 -d参数表示在后台运行容器,-p 9206:9205 将容器内部的 9205 端口映射到宿主机的 9206 端口,这样就可以通过 http://localhost:9206 访问应用程序,至此,我的项目就已经制作成了 Docker 镜像,并且可以在 Docker 容器中运行了。

发布到Github Packages

这部分确实花了我不少时间,我先把正确的流程描述完,然后再说一下我遇到的问题。

  1. 到Developer Settings (classic) 申请一个token,记得至少勾选 read:packageswrite:packages 权限

  2. 登录docker,使用上一步申请的token

sudo docker login ghcr.io --username your-github-username --password-stdin your-personal-access-token
  1. 给镜像添加标签
sudo docker tag your-image-id ghcr.io/your-github-username/your-image-name:1.0.0
  1. 将docker镜像推送到Github Packages上
sudo docker push ghcr.io/your-github-username/your-image-name:1.0.0

坑坑到位

申请token的坑

许多教程上申请token截图还是只有一个页面,但是现在(2024-3-8)的Github上申请的token的页面已经分成了两类,具体导航路径在『Github头像』->『Settings』->『Developer Settings』->『Personal access tokens』,到此处申请token页面分成了两个,分别是 Fine-grained tokensTokens (classic),最近几次其他的访问权限分配我都是用的前面这种Fine-grained tokens,虽然标记着 Beta,但这是官方推荐的形式。

但这一次我却遇到了 unauthorized: unauthenticated: User cannot be authenticated with the token provided. 这个问题,后来改成Tokens (classic)这种类型的token才解决,可以看到的是第一个Fine-grained tokens中我没有找到read:packageswrite:packages 权限,不知道是不是和这个有关,我还在尝试。

那么在申请 Tokens (classic) 时要记得勾选read:packageswrite:packages 权限,最好把 delete:packagesrepo 也勾选上,如果想通过token更新Github Actions,最好也要勾选上 workflow

Fine-grained tokens:这种token形如 github_pat_xxx,位数较长

Tokens (classic):这种token形如 ghp_xxx,位数较短

docker登录的坑

很多帖子可能是时间太久远了,里面提到的地址都是 docker.pkg.github.com,我这里倒是都显示登录成功,但是每次推送都会提示 no basic auth credentials,就像下面这样

$ cat ~/TOKEN.txt | docker login https://docker.pkg.github.com -u AlbertGithubHome --password-stdin
WARNING! Your password will be stored unencrypted in /home/shz/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-store

Login Succeeded

$ sudo docker push docker.pkg.github.com/albertgithubhome/minimalist-tool-web/tools-web:1.0.0
The push refers to repository [docker.pkg.github.com/albertgithubhome/minimalist-tool-web/tools-web]
c0f047bfac29: Preparing
87174263225b: Preparing
5462d39b06ad: Preparing
2c604764da2f: Preparing
a469c5a79f90: Preparing
7402639a4746: Waiting
42672d5bf49e: Waiting
678cac8b069e: Waiting
d4fc045c9e3a: Waiting
no basic auth credentials

后来在 Stack Overflow 上找到一个问题,里面用的是 ghcr.io 修改之后发现才可以

给镜像添加标签的坑

这个需要注意的点是整个标签的字母必须都是小写的,而我的用户名是大写,所以我按照老版本的教程创建了类似 docker tag f11497961379 docker.pkg.github.com/albertgithubhome/minimalist-tool-web/tools-web:1.0.0 的标签,但是我的用户名是大写的,每次推送失败告诉我未验证时,我无法确定是哪类的问题:

  1. token类型有问题
  2. 权限有问题,登录没有用sudo
  3. 登录地址有问题,https://docker.pkg.github.com地址打不开
  4. 我的用户名有大写字母,与推送的镜像名中的用户名不匹配

反正费了九牛二虎之力吧,把这些原因一一排除掉,总算能推送上去了

还有一点,之前老版本的教程标签格式要求是 docker.pkg.github.com/your-github-username/your-repository/your-image-name:1.0.0,在新版的教程中改为了 ghcr.io/your-github-username/your-image-name:1.0.0,不要求添加库的名称了

docker推送的坑

这一步的坑都是前面几步积累得来的,因为这一步的失败根本不知道前边哪一步出错了,更离谱的是在登录这一步,无论用户名是什么,token是什么都显示登录成功,导致后面查找原因浪费了不少时间

推送时直接填写前面的标签名即可

$ sudo docker push ghcr.io/albertgithubhome/minimalist-tool-web:1.0.0
The push refers to repository [ghcr.io/albertgithubhome/minimalist-tool-web]
c0f047bfac29: Pushed
87174263225b: Pushed
5462d39b06ad: Pushed
2c604764da2f: Pushed
a469c5a79f90: Pushed
7402639a4746: Pushed
42672d5bf49e: Pushed
678cac8b069e: Pushed
d4fc045c9e3a: Pushed
1.0.0: digest: sha256:f749fd2eba021248c97c8a44374772165372354b9d48f4f6b845bbce46d02402 size: 2201

这些参数可以在 ghcr.io 查看,页面上有一个示例

ghcr.io

echo $PAT | docker login ghcr.io --username phanatic --password-stdin
docker tag app ghcr.io/phanatic/app:1.0.0
docker push ghcr.io/phanatic/app:1.0.0

在Github Packages上查看

打开你账号下的Packages页签就能看到了,点击进去可以将这个 package 关联到指定项目,这样在项目的首页右侧的packages区域就能看到这个package,在package的介绍页面会教你怎么使用这个镜像

docker pull ghcr.io/albertgithubhome/minimalist-tool-web:1.0.0

minimalist-tool-web

总结

  • GitHub Actions 是一个Github原生的持续集成和部署的工作流组件,相当免费绑定了一个Jenkins服务
  • GitHub Packages 是和每一个代码仓库关联的软件包仓库,类似我们熟知的maven中央仓库和nmp仓库
  • 运行docker命令 docker run -d -p 9206:9205 minimalist-tool-web,其中minimalist-tool-web是镜像名
  • 停止docker命令 sudo docker stop af98cf2f93bf,其中af98cf2f93bf是容器ID
  • 推送docker命令 sudo docker push ghcr.io/albertgithubhome/minimalist-tool-web:1.0.0
  • 拉取docker命令 sudo docker pull ghcr.io/albertgithubhome/minimalist-tool-web:1.0.0
  • 最终Fine-grained tokens应该会替换到Tokens (classic),但现在感觉还不能完全代替
  • 接下来会尝试用.yml编写一个GitHub Action控制项目更新时自动创建镜像和发布

==>> 反爬链接,请勿点击,原地爆炸,概不负责!<<==

从秦灭六国、焚书坑儒开始,从罢黜百家、独尊儒术开始,洗脑便已经登峰造极了~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/442462.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

《Graphis》杂志报道,凯毅文化斩获两项国际金奖

一、凯毅文化获美国Graphis 2024年度奖金奖   近日&#xff0c;收到美国《Graphis》团队邮件约稿&#xff0c;将对深圳凯毅文化获得Graphis年度金奖的作品《城市与自然》进行案例报道。在Graphis 2024年度奖项评选中&#xff0c;凯毅文化作品获得一项金奖&#xff0c;二项银奖…

原生JavaScript,根据后端返回JSON动态【动态列头、动态数据】生成表格数据

前期准备&#xff1a; JQ下载地址&#xff1a; https://jquery.com/ <!DOCTYPE html> <html><head><meta charset"utf-8"><title>JSON动态生成表格数据,动态列头拼接</title><style>table {width: 800px;text-align: cen…

如何用一台电脑主机连两个显示器同步?

本文介绍如何使用一台电脑主机连接两台显示器并同步两台显示器&#xff01; 有两种方法。 方法一&#xff1a;使用两根信号线将两台显示器连接至显卡上的两个视频输出接口。 计算机显卡必须支持双输出&#xff0c;具有两个视频接口&#xff0c;用于连接不同的显示器。 设置方…

学习与学习理论 - 2024教招 - test

一 方向 方向性很重要&#xff0c;像学投篮一样关注发力顺序才是关键出发点&#xff0c;如果这个出发点没确定下来&#xff0c;会走许多弯路。所有学习理论大的观点&#xff0c;到某个人物个人的观点。被干掉之前&#xff08;不能被干掉&#xff09;&#xff0c;掌握所需的知识…

20240309-2-校招前端面试常见问题-NodeJS

校招前端面试常见问题【6】——NodeJS NodeJS Q&#xff1a;NodeJS 的 IO 模型特点是什么&#xff1f;与多线程同步 IO 有什么不同&#xff1f; NodeJS 的 IO 模型&#xff08;更准确的说是 js 的执行环境&#xff0c;也就是 v8&#xff09;的特点是“单线程异步非阻塞”。 …

数据资产运营:快消品牌的新竞争力

在数字化浪潮的推动下&#xff0c;快消品行业正经历一场由数据驱动的变革。从消费者购买行为到市场动态&#xff0c;数据正在成为快消品牌创新和维持竞争优势的关键资源。本文将探讨如何通过高效的数据资产运营提升快消品牌的市场敏锐度和业务成效。 一、数据资产在快消品牌中的…

学习JavaEE日子 Day24 TreeSet,内置比较器,外置比较器,HashMap

Day24 TreeSet 1.TreeSet 1.1 TreeSet的使用 注意&#xff1a;TreeSet的使用和HashSet一样 public class Test01 {public static void main(String[] args) {//创建TreeSet集合的对象TreeSet<String> set new TreeSet<>();//添加元素set.add("麻生希"…

优先权的不同特征性质

目录 1.强占式&#xff0c;静态优先权&#xff0c;动态优先权 2.先来服务算法&#xff0c;高响应比优先算法&#xff0c;时间片轮转算法&#xff0c;非抢占式短任务优先 1.强占式&#xff0c;静态优先权&#xff0c;动态优先权 2.先来服务算法&#xff0c;高响应比优先算法&am…

day11_SpringCloud(Nacos注册中心,LoadBalancer,OpenFeign)

文章目录 Spring Cloud Alibaba1 系统架构演进1.1 单体架构1.2 微服务架构1.3 分布式和集群 2 Spring Cloud Alibaba概述2.1 Spring Cloud简介2.2 Spring Cloud Alibaba简介 3 微服务环境准备3.1 工程结构说明3.2 父工程搭建3.3 用户微服务搭建3.3.1 基础环境搭建3.3.2 基础代码…

Luajit 2023移动版本编译 v2.1.ROLLING

文章顶部有编好的 2.1.ROLLING 2023/08/21版本源码 Android 64 和 iOS 64 luajit 目前最新的源码tag版本为 v2.1.ROLLING on Aug 21, 2023应该是修正了很多bug, 我是出现下面问题才编的. cocos2dx-lua 游戏 黑屏 并报错: [LUA ERROR] bad light userdata pointer 编…

德人合科技|天锐绿盾加密软件——数据防泄漏系统

德人合科技是一家专注于提供企业级信息安全解决方案的服务商&#xff0c;提供的天锐绿盾加密软件是一款专为企业设计的数据安全防护产品&#xff0c;主要用于解决企事业单位内部敏感数据的防泄密问题。 www.drhchina.com PC端&#xff1a; https://isite.baidu.com/site/wjz012…

同时上内网和外网(笔记本自带的无线网卡和另外购置无线网卡)

同时上内网和外网 两无线网卡连接内外网插入新网卡后&#xff0c;重命名网卡名字信息收集IPv4属性设置永久路由 两无线网卡连接内外网 插入新网卡后&#xff0c;重命名网卡名字 两网卡同时连接网络&#xff0c;使用ipconfig /all 获取信息&#xff0c;整理如下&#xff1a; 下…

[BUUCTF]-PWN:starctf_2019_babyshell解析(汇编\x00开头绕过+shellcode)

查看保护 查看ida 这里就是要输入shellcode&#xff0c;但是函数会有检测。 在shellcode前面构造一个以\x00机器码开头的汇编指令&#xff0c;这样就可以绕过函数检查了。 完整exp&#xff1a; from pwn import* context(log_leveldebug,archamd64) pprocess(./babyshell)she…

CorelDRAW Standard2024适合业余爱好者和家庭企业的图形设计软件

CorelDRAW Standard 2024是一款功能强大的矢量图形设计软件&#xff0c;专为图形爱好者、家庭用户、微型企业和学生们设计。该软件在Windows平台上运行&#xff0c;并提供了智能对象、布局、插图和模板等功能&#xff0c;帮助用户快速创建高质量的设计作品。 CorelDRAW Standa…

npm install没有创建node_modules文件夹

问题记录 live-server 使用时 报错&#xff1a;live-server : 无法将“live-server”项识别为 cmdlet、函数、脚本文件或可运行程序的名称。 npm install 安装 但是 这时npm install没有创建node_modules文件夹&#xff0c;只生成package-lock.json文件 方法一&#xff1a; 手…

JetPack入门

先导入依赖 implementation("androidx.lifecycle:lifecycle-extensions:2.2.0") 1.使用LifeCycle解耦页面与组件 Activity package com.tiger.lifecycle;import android.annotation.SuppressLint; import android.os.Bundle; import android.os.SystemClock; impo…

Halcon局部可变形模板匹配

文章目录 算子Halcon 使用局部变形算法案例 算子 create_local_deformable_model 创建局部可变形模板 prepare_direct_variation_model(RefImage, VarImage : : ModelID, AbsThreshold, VarThreshold : ) 以下是参数的解释&#xff1a;RefImage (输入对象)&#xff1a;对象的参…

Web核心

JavaWeb技术栈 B/S架构&#xff1a;Browser/Server &#xff0c; 浏览器/服务器 架构模式&#xff0c;其特点为&#xff0c;客户端只需要浏览器&#xff0c;应用程序的逻辑和数据都存储在服务器端。浏览器只需要请求服务器&#xff0c;获取Web资源&#xff0c;服务器把Web资源…

python编程从入门到实践

python编程从入门到实践 if语句1.条件测试&#xff1a;2.更多的条件测试&#xff1a;3.外星人颜色#1&#xff1a;4. 外星人颜色#2&#xff1a;5. 外星人颜色#3&#xff1a;6. 人生的不同阶段&#xff1a;7. 喜欢的水果&#xff1a;8. 以特殊方式跟管理员打招呼&#xff1a;9. 处…

专业140+总430+电子科技大学858信号与系统考研经验成电电子信息与通信工程,电科大,真题,大纲,参考书。

今年考研成绩出来&#xff0c;初试专业课858信号与系统140&#xff0c;总分430&#xff0c;其余各门分数都比较平稳&#xff0c;总分好于自己估分&#xff0c;应群里很多同学要求&#xff0c;我总结一下自己的复习经验。首先我是一个大冤种&#xff0c;专业课资料学长给了一套&…