Fastapi框架(18)Fastapi容器化部署+Drone 完整的CI示例简单全过程(仅用于演示流程)

1,006 阅读14分钟

说明

通过之前一些学习和实践的过程中,其实非专业的运维的人员来搞CI,自我感觉确实不太合适!不过为了学习,鼓捣以下也是有必要,至少你了解过这些过程是怎么弄,也是非常不错滴!

实际操作

首先需要说明的一点,本文记录的操作仅限于个人学习实战的结果,生产环境上还是需要考虑很多的问题,比如宿主机的挂载,还有安全等问题。所以如果有哪位大佬愿意可以带带我学习一下生产环境下应用的话~我请他吃大餐···哈哈

因为之前所有的相关的服务操作都是基于docker下,所以前提的就是你需要安装好Docker环境,以下是为了笔记完整性和阅读进行想的所有的步骤的总汇。

1:Docker环境搭建(linux)

1.1 基础环境

image.png

Docker要求的系统内核高于3.10,查看系统版本信息

[root@localhost ~]# uname -r
3.10.0-514.el7.x86_64
[root@localhost ~]#

准备 更新的相关的yum包

[root@localhost ~]# yum update

或

yum makecache fast

更换设置YUM源设置:

[root@localhost ~]#yum-config-manager -add-repo
https://download.docker.com/linux/centos/docker-ce.repo

更换为阿里云:

[root@localhost ~]# yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

PS:因为我是本地自己搭建的虚拟机来学习的,再安全docker之前记得社会一下设置,避免安装的时候出现错误提示。

[root@localhost ~]# date
Wed Jul 29 11:25:29 CST 2020
[root@localhost ~]# date -s "2020-10-19 13:35:30"
Mon Oct 19 13:35:30 CST 2020
[root@localhost ~]# date
Mon Oct 19 13:35:31 CST 2020

1.2 详细步骤

1):删除旧版的数据(没安装过)

[root@localhost ~]#  yum remove docker \
>                   docker-client \
>                   docker-client-latest \
>                   docker-common \
>                   docker-latest \
>                   docker-latest-logrotate \
>                   docker-logrotate \
>                   docker-selinux \
>                   docker-engine-selinux \
>                   docker-engine
Loaded plugins: fastestmirror
No Match for argument: docker
No Match for argument: docker-client
No Match for argument: docker-client-latest
No Match for argument: docker-common
No Match for argument: docker-latest
No Match for argument: docker-latest-logrotate
No Match for argument: docker-logrotate
No Match for argument: docker-selinux
No Match for argument: docker-engine-selinux
No Match for argument: docker-engine
No Packages marked for removal

2)第2步: 安装相关的依赖

[root@localhost ~]# yum install -y yum-utils device-mapper-persistent-data lvm2

3): 配置YUN源:

[root@localhost ~]# yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
Loaded plugins: fastestmirror
adding repo from: http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
grabbing file http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo to /etc/yum.repos.d/docker-ce.repo
repo saved to /etc/yum.repos.d/docker-ce.repo

如果出现:

Loaded plugins: fastestmirror

执行:

yum makecache fast
或
yum clean metadata

补充:查看docker版本

 yum list docker-ce --showduplicates | sort -r

4): 执行官方的安装脚本(安装的社区版滴)

curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun

```
yum install docker-ce docker-ce-cli containerd.io
```

5): 验证安装


[root@localhost ~]# docker --version
Docker version 20.10.7, build f0df350
[root@localhost ~]#

6): 配置开机启动

[root@localhost ~]# systemctl enable docker

7): 启动docker

systemctl start docker

8): 运行一个简单的示例容器:docker run hello-world

[root@localhost ~]# docker run hello-world

提示错误: image.png

更新yum源后还是错,但是是另一种错误

image.png

上面情况应该是和网络有关系,因为本地的没有这个容器,所有会从 hub.docker.com/进行拉取,国内国外的网络问题吧! 这种情况你可以配置一下使用国内的云 不从hub.docker.com拉取!

别人提供的解决方案是(未实践,我的多拉几次他就好了!)或看下文的配置阿里云的加速镜像:

systemctl stop docker

echo "DOCKER_OPTS="$DOCKER_OPTS --registry-mirror=http://f2d6cb40.m.daocloud.io"" | sudo tee -a /etc/default/docker

service docker restart

9):查看所有的容器:

[root@localhost ~]# docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                     PORTS               NAMES
d6087f654d9e        hello-world         "/hello"            4 minutes ago       Exited (0) 4 minutes ago                       practical_wozniak
[root@localhost ~]#

10):列出所有在运行的容器信息

docker ps

11)总结运行容器示docker run hello-world 流程说明

  • 1 执行docker run hello-world,再本机查找hello-world镜像

    • 如果镜像存在,则已该镜像为模板生成容器实例运行
    • 如果镜像不存在,则会去远程的 hub.docker.com/进行查询\
  • 2 如远程仓库镜像查询,有无,有则拉取下载到本地,无则提示镜像不存在。

2.1 配置阿里云镜像加速

2.1.1 原因:

龟速和加速的区别。

2.1.2 详细步骤

1)登入阿里云镜像服务中心(需使用账号登入)

地址:cr.console.aliyun.com/cn-shenzhen…

2)获取地址:

image.png 3)按照要求修改OS的Docker配置文件

image.png

在/etc/docker/下查找daemon.json文件,没有这个文件的话则创建。并写入以下的内容:


[root@localhost ~]# nano /etc/docker/daemon.json
[root@localhost ~]#

写入的内容(注意地址使用你自己申请到的地址,xxxx数你自己的ID):

{
  "registry-mirrors": ["https://xxxxxxxx.mirror.aliyuncs.com"]
}

4 ) 重启daemon

 [root@localhost ~]#systemctl daemon-reload

5 ) 重启docker

[root@localhost ~]# systemctl restart docker

6 ) 查看修改的后docker信息

[root@localhost ~]# docker info
Client:
 Debug Mode: false

Server:
 Containers: 2
  Running: 0
  Paused: 0
  Stopped: 2
 Images: 1
 Server Version: 19.03.13
 Storage Driver: overlay2
  Backing Filesystem: xfs
  Supports d_type: true
  Native Overlay Diff: false
 Logging Driver: json-file
 Cgroup Driver: cgroupfs
 Plugins:
  Volume: local
  Network: bridge host ipvlan macvlan null overlay
  Log: awslogs fluentd gcplogs gelf journald json-file local logentries splunk syslog
 Swarm: inactive
 Runtimes: runc
 Default Runtime: runc
 Init Binary: docker-init
 containerd version: 8fba4e9a7d01810a393d5d25a3621dc101981175
 runc version: dc9208a3303feef5b3839f4323d9beb36df0a9dd
 init version: fec3683
 Security Options:
  seccomp
   Profile: default
 Kernel Version: 3.10.0-514.el7.x86_64
 Operating System: CentOS Linux 7 (Core)
 OSType: linux
 Architecture: x86_64
 CPUs: 1
 Total Memory: 976.5MiB
 Name: localhost.localdomain
 ID: TT6R:HUR2:3AQG:JLBU:CGAO:BG5T:LMC4:FYTX:PRGV:4D56:4TAN:BGFE
 Docker Root Dir: /var/lib/docker
 Debug Mode: false
 Registry: https://index.docker.io/v1/
 Labels:
 Experimental: false
 Insecure Registries:
  127.0.0.0/8
 Registry Mirrors:
  https://aiyf7r3a.mirror.aliyuncs.com/
 Live Restore Enabled: false

WARNING: bridge-nf-call-iptables is disabled
WARNING: bridge-nf-call-ip6tables is disabled
[root@localhost ~]#

7 ) 测试拉取一个ubuntu:15.10的镜像

[root@localhost ~]# docker pull ubuntu:15.10
15.10: Pulling from library/ubuntu
7dcf5a444392: Pull complete
759aa75f3cee: Pull complete
3fa871dc8a2b: Pull complete
224c42ae46e7: Pull complete
Digest: sha256:02521a2d079595241c6793b2044f02eecf294034f31d6e235ac4b2b54ffc41f3
Status: Downloaded newer image for ubuntu:15.10
docker.io/library/ubuntu:15.10
[root@localhost ~]#

附加其他的对镜像的操作测试处理:

8) 查看本地的镜像


[root@localhost ~]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
hello-world         latest              bf756fb1ae65        9 months ago        13.3kB
ubuntu              15.10               9b9cb95443b5        4 years ago         137MB
[root@localhost ~]#

9)使用镜像跑一个示例 前台模式的启动

说明:/bin/echo "Hello world": 在启动的容器里执行的命令

[root@localhost ~]# docker run ubuntu:15.10 /bin/echo "Hello world"
Hello world

其他一些容器的基本的操作:
root@0a22083fa318:~# cd ll
bash: cd: ll: No such file or directory
root@0a22083fa318:~# cd ~
root@0a22083fa318:~# ll
total 8
drwx------. 2 root root   37 Jul  6  2016 ./
drwxr-xr-x. 1 root root    6 Oct 19 07:57 ../
-rw-r--r--. 1 root root 3106 Feb 20  2014 .bashrc
-rw-r--r--. 1 root root  140 Feb 20  2014 .profile
root@0a22083fa318:~# cd ..
root@0a22083fa318:/# ls
bin   dev  home  lib64  mnt  proc  run   srv  tmp  var
boot  etc  lib   media  opt  root  sbin  sys  usr
root@0a22083fa318:/# eixt
bash: eixt: command not found
root@0a22083fa318:/# exit
exit
[root@localhost ~]# docker run -i -t ubuntu:15.10 /bin/bash
root@a2cc1c83603a:/# exit

10)前台模式的启动 查看的相关的容器情况


[root@localhost ~]# docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED              STATUS                        PORTS               NAMES
a2cc1c83603a        ubuntu:15.10        "/bin/bash"              26 seconds ago       Exited (0) 24 seconds ago                         elated_cartwright
0a22083fa318        ubuntu:15.10        "/bin/bash"              About a minute ago   Exited (127) 29 seconds ago                       epic_galileo
e0069b97f043        ubuntu:15.10        "/bin/echo 'Hello wo…"   3 minutes ago        Exited (0) 3 minutes ago                          intelligent_lamport
209fc9dd3324        hello-world         "/hello"                 56 minutes ago       Exited (0) 56 minutes ago                         flamboyant_knuth
d6087f654d9e        hello-world         "/hello"                 2 hours ago          Exited (0) 2 hours ago                            practical_wozniak

11)后台的模式启动的容器实例

[root@localhost ~]# docker run -d ubuntu:15.10 /bin/sh -c "while true; do echo hello world; sleep 1; done"
f1b40b91bb48a2cc832412b9e71860a44cddcd4fa83a82db7b64fcc9c68ad82f
[root@localhost ~]#

12)再次查看容器的情况:


[root@localhost ~]# docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS               NAMES
f1b40b91bb48        ubuntu:15.10        "/bin/sh -c 'while t…"   3 minutes ago       Up 3 minutes                            great_tereshkova
[root@localhost ~]#

13)停止容器:

[root@localhost ~]# docker stop f1b40b91bb48
f1b40b91bb48
[root@localhost ~]#

[root@localhost ~]# docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
[root@localhost ~]#

3.1 开启远程访问(非必要,注意安全问题)

Docker远程访问可以用于手续的,直接使用Pycharm等工具连接的到我们的Docker,然后直接的使用工具进行镜像的制作!

PS:该方法千万不要在生产环境,否则100%被挖矿!!!!!!!!!!!!!

3.1.1 步骤

  • 1)编辑docker的宿主机文件/lib/systemd/system/docker.service
[Unit]
Description=Docker Application Container Engine
Documentation=https://docs.docker.com
BindsTo=containerd.service
After=network-online.target firewalld.service containerd.service
Wants=network-online.target
Requires=docker.socket

[Service]
Type=notify
# the default is not to use systemd for cgroups because the delegate issues still
# exists and systemd currently does not support the cgroup feature set required
# for containers run by docker
ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock
ExecReload=/bin/kill -s HUP $MAINPID
TimeoutSec=0
RestartSec=2
Restart=always

# Note that StartLimit* options were moved from "Service" to "Unit" in systemd 229.
# Both the old, and new location are accepted by systemd 229 and up, so using the old location
# to make them work for either version of systemd.
StartLimitBurst=3

# Note that StartLimitInterval was renamed to StartLimitIntervalSec in systemd 230.
# Both the old, and new name are accepted by systemd 230 and up, so using the old name to make
# this option work for either version of systemd.
StartLimitInterval=60s

# Having non-zero Limit*s causes performance problems due to accounting overhead
# in the kernel. We recommend using cgroups to do container-local accounting.
LimitNOFILE=infinity
LimitNPROC=infinity
LimitCORE=infinity

# Comment TasksMax if your systemd version does not support it.
# Only systemd 226 and above support this option.
TasksMax=infinity

# set delegate yes so that systemd does not reset the cgroups of docker containers
Delegate=yes

# kill only the docker process, not all processes in the cgroup
KillMode=process

[Install]
WantedBy=multi-user.target


  • 2)修改内容:
ExecStart=/usr/bin/dockerd -H tcp://0.0.0.0:2375 -H unix://var/run/docker.sock
  • 3)更新修改
[root@localhost web_statistics]# systemctl daemon-reload
    1. 重启docker服务
[root@localhost web_statistics]# systemctl restart docker
    1. 测试访问情况
[root@localhost web_statistics]# curl http://localhost:2375/version
{"Platform":{"Name":"Docker Engine - Community"},"Components":[{"Name":"Engine","Version":"19.03.13","Details":{"ApiVersion":"1.40","Arch":"amd64","BuildTime":"2020-09-16T17:02:21.000000000+00:00","Experimental":"false","GitCommit":"4484c46d9d","GoVersion":"go1.13.15","KernelVersion":"3.10.0-1127.19.1.el7.x86_64","MinAPIVersion":"1.12","Os":"linux"}},{"Name":"containerd","Version":"1.3.7","Details":{"GitCommit":"8fba4e9a7d01810a393d5d25a3621dc101981175"}},{"Name":"runc","Version":"1.0.0-rc10","Details":{"GitCommit":"dc9208a3303feef5b3839f4323d9beb36df0a9dd"}},{"Name":"docker-init","Version":"0.18.0","Details":{"GitCommit":"fec3683"}}],"Version":"19.03.13","ApiVersion":"1.40","MinAPIVersion":"1.12","GitCommit":"4484c46d9d","GoVersion":"go1.13.15","Os":"linux","Arch":"amd64","KernelVersion":"3.10.0-1127.19.1.el7.x86_64","BuildTime":"2020-09-16T17:02:21.000000000+00:00"}
[root@localhost web_statistics]#

  • 6)外网访问

image.png

2:docker-compose 安装(linux)

yum install -y git
pip3 install docker-compose

3:基于docker-compose 搭建gogs+drone环境

image.png

3.1 编写编排文件:

version: '3'
services:
  gogs:
    image: gogs/gogs:latest
    container_name: gogs
    ports:
      - "3000:3000"
      - "10022:22"
    volumes:
      - ./data/fastapi_drone/gogs:/data

  gogspgdb:
    image: "postgres:9.4"
    restart: always
    environment:
      POSTGRES_USER: postgres
      POSTGRES_PASSWORD: 123456
      POSTGRES_DB: gogs
    ports:
      - '5566:5432'
    volumes:
      - ./data/fastapi_drone/pgdata:/var/lib/postgresql/data

  drone-server:
    image: drone/drone:latest
    container_name: drone-server
    ports:
      - "8080:80"
      - "8443:443"
    volumes:
      - ./data/fastapi_drone/drone:/var/lib/drone/
      - /var/run/docker.sock:/var/run/docker.sock
    restart: always
    environment:
      - DRONE_DEBUG=true
      # 启动日志,默认是关闭的
      - DRONE_LOGS_TRACE=true
      # 启动 debug 日志,默认是关闭的
      - DRONE_LOGS_DEBUG=true
      - DRONE_OPEN=true
      # 设置 drone-server 使用的 host 名称,可以是 ip 地址加端口号;容器中可以使用容器名称代替
      - DRONE_SERVER_HOST=drone-server
      - DRONE_GIT_ALWAYS_AUTH=false
      # 开启 gogs
      - DRONE_GOGS=true
      - DRONE_GOGS_SKIP_VERIFY=false
      # gogs 服务地址,使用容器名 + 端口号
      - DRONE_GOGS_SERVER=http://gogs:3000
      # drone 的提供者,本项目中为 gogs 服务
      - DRONE_PROVIDER=gogs
      # 配置 drone 数据库
      - DRONE_DATABASE_DRIVER=sqlite3
      # 配置 drone 数据库文件
      - DRONE_DATABASE_DATASOURCE=/var/lib/drone/drone.sqlite
      # 协议,可选 http、https
      - DRONE_SERVER_PROTO=http
      # 秘钥,用于 drone-server 与 drone-agent 之间的 RPC 请求
      - DRONE_RPC_SECRET=xiaozhong
      # 秘钥,用于 drone-server 与 drone-agent 直接的请求
      - DRONE_SECRET=xiaozhong
      #  这行非常关键,加上之后,使用 yourUsername 用户名登录 drone 便成为了管理员,如果不加,则看不到Trusted那个按钮,也可以修改数据库!
      - DRONE_USER_CREATE=username:zyx308711822,admin:true

  drone-agent:
    image: drone/agent:latest
    container_name: drone-agent
    depends_on:
      - drone-server
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
    restart: always
    environment:
      - DRONE_DEBUG=true
      # 启动日志,默认是关闭的
      - DRONE_LOGS_TRACE=true
      # 启动 debug 日志,默认是关闭的
      - DRONE_LOGS_DEBUG=true
      # 设置 drone-server 使用的 host 名称,可以是 ip 地址加端口号;容器中可以使用容器名称代替
      - DRONE_RPC_SERVER=http://drone-server
      # 秘钥,用于 drone-server 与 drone-agent 之间的 RPC 请求
      - DRONE_RPC_SECRET=xiaozhong
      - DRONE_SERVER=drone-server:9000
      # 秘钥,用于 drone-server 与 drone-agent 直接的请求
      - DRONE_SECRET=xiaozhong
      - DRONE_MAX_PROCS=5
      #   - DOCKER_HOST=tcp://127.0.0.1:2375

新的:

version: '3'
services:
  gogs:
    image: gogs/gogs:latest
    container_name: gogs
    ports:
      - "3000:3000"
      - "10022:22"
    volumes:
      - /data/fastapi_drone/gogs:/data

  gogspgdb:
    image: "postgres:9.4"
    restart: always
    environment:
      POSTGRES_USER: postgres
      POSTGRES_PASSWORD: 123456
      POSTGRES_DB: gogs
    ports:
      - '5566:5432'
    volumes:
      - /data/fastapi_drone/pgdata:/var/lib/postgresql/data

  drone-server:
    image: drone/drone:latest
    container_name: drone-server
    ports:
      - "8080:80"
      - "8443:443"
    volumes:
      - /data/fastapi_drone/drone:/var/lib/drone/
      - /var/run/docker.sock:/var/run/docker.sock
    restart: always
    environment:
      - DRONE_DEBUG=true
      # 启动日志,默认是关闭的
      - DRONE_LOGS_TRACE=true
      # 启动 debug 日志,默认是关闭的
      - DRONE_LOGS_DEBUG=true
      - DRONE_OPEN=true
      # 设置 drone-server 使用的 host 名称,可以是 ip 地址加端口号;容器中可以使用容器名称代替
      - DRONE_SERVER_HOST=drone-server
      - DRONE_GIT_ALWAYS_AUTH=false
      # 开启 gogs
      - DRONE_GOGS=true
      - DRONE_GOGS_SKIP_VERIFY=false
      # gogs 服务地址,使用容器名 + 端口号
      - DRONE_GOGS_SERVER=http://gogs:3000
      # drone 的提供者,本项目中为 gogs 服务
      - DRONE_PROVIDER=gogs
      # 配置 drone 数据库
      - DRONE_DATABASE_DRIVER=sqlite3
      # 配置 drone 数据库文件
      - DRONE_DATABASE_DATASOURCE=/var/lib/drone/drone.sqlite
      # 协议,可选 http、https
      - DRONE_SERVER_PROTO=http
      # 秘钥,用于 drone-server 与 drone-agent 之间的 RPC 请求
      - DRONE_RPC_SECRET=xiaozhong
      # 秘钥,用于 drone-server 与 drone-agent 直接的请求
      - DRONE_SECRET=xiaozhong
      #  这行非常关键,加上之后,使用 yourUsername 用户名登录 drone 便成为了管理员,如果不加,则看不到Trusted那个按钮,也可以修改数据库!
      - DRONE_USER_CREATE=username:zyx308711822,admin:true

  drone-agent:
    image: drone/agent:latest
    container_name: drone-agent
    depends_on:
      - drone-server
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
    restart: always
    environment:
      - DRONE_DEBUG=true
      # 启动日志,默认是关闭的
      - DRONE_LOGS_TRACE=true
      # 启动 debug 日志,默认是关闭的
      - DRONE_LOGS_DEBUG=true
      # 设置 drone-server 使用的 host 名称,可以是 ip 地址加端口号;容器中可以使用容器名称代替
      - DRONE_RPC_SERVER=http://drone-server
      # 秘钥,用于 drone-server 与 drone-agent 之间的 RPC 请求
      - DRONE_RPC_SECRET=xiaozhong
      - DRONE_SERVER=drone-server:9000
      # 秘钥,用于 drone-server 与 drone-agent 直接的请求
      - DRONE_SECRET=xiaozhong
      - DRONE_MAX_PROCS=5
      #   - DOCKER_HOST=tcp://127.0.0.1:2375

3.2 启动相关的容器服务

[root@localhost fd]#  docker-compose -f drone_docker_compose_linux.yml up

3.3 配置gogs信息

image.png

image.png

3.3.1 立即安装(错误解决问题-数据库主机地址问题)

image.png

查阅官方字典信息:

image.png

image.png

(默认同属于启动的默认网桥中)查看容器对应的ip信息:

image.png

image.png

修改数据库主机地址:

image.png

然后正常安装了且可以需要登入:

image.png

此时可以进入到我们的仓库:

image.png

PS: 文中因为部分的截图是以前,所以部分的端口的截图可能不一样!注意下面的访问说明!

最终我们的访问的仓库地址为:http://192.168.219.131:3000/

3.3 新建gogs仓库

image.png

3.4 Drone同步仓库项目信息

根据配置文件启动的,访问地址是:http://192.168.219.131:8080

image.png

再同步这个这个需要注意事项点:

如果需要再流水线构建的过程中进行宿主机的目录的挂载的话,需要使用管理员身份信息进行开启我们的信任按钮:

image.png

PS:如果没有看到这个开关的话,说明你使用的账号不是管理员信息,可以通过数据库信息修改,也可以再构建流水线的过程中设置用户信息: 如:

image.png 具体代码:

      #  这行非常关键,加上之后,使用 yourUsername 用户名登录 drone 便成为了管理员,如果不加,则看不到Trusted那个按钮
      - DRONE_USER_CREATE=username:zyx308711822,admin:true

3.5 Drone同步仓库项目之后开始激活

image.png

PS:这个激活操作之后,会默认的在gogs那进行配置webhooks

image.png

首次的激活成功,你可以推送测试验证一下:

image.png

4:git检测项目,并定制好项目的容器启动和配置文件

image.png

4.1 定义我们的app测试main.py:

#!/usr/bin/evn python
# -*- coding: utf-8 -*-
"""
-------------------------------------------------
   文件名称 :     main
   文件功能描述 :   功能描述
   创建人 :       小钟同学
   创建时间 :          2021/8/2
-------------------------------------------------
   修改描述-2021/8/2:
-------------------------------------------------
"""
from fastapi import FastAPI
from aioredis import create_redis_pool, Redis

import uvicorn
app = FastAPI()





@app.on_event('startup')
async def startup_event():
    """
    获取链接
    :return:
    """
    import psycopg2
    # 获得游标对象
    conn = psycopg2.connect(database="ceshi", user="postgres", password="123456", host="container-db", port="5432")
    cursor = conn.cursor()
    # sql语句
    sql = "SELECT VERSION()"
    # 执行语句
    cursor.execute(sql)
    # 获取单条数据.
    data = cursor.fetchone()
    # 打印
    print("database version : %s " % data)
    # 事物提交
    conn.commit()
    # 关闭数据库连接
    conn.close()


@app.on_event('shutdown')
async def shutdown_event():
    """
    关闭
    :return:
    """



@app.get("/")
def read_root():

    # 测试连接redis

    # 测试连接数据库

    return {"小钟同学": "你是我的情人了22222222222222!!!!!"}

if __name__ == '__main__':
    # 启动服务
    uvicorn.run('main:app', host='0.0.0.0', port=8081, debug=True, reload=True, access_log=False,workers=1, use_colors=True)


4.2 定制启动fastapi服务的Dockerfile:

FROM python:3.7
WORKDIR /app
COPY ./app ./app
COPY requirements.txt .
RUN pip install --upgrade pip -i http://pypi.douban.com/simple/ --trusted-host pypi.douban.com \
    && pip install setuptools==33.1.1 -i http://pypi.douban.com/simple/ --trusted-host pypi.douban.com \
    && pip install -i https://mirrors.aliyun.com/pypi/simple/ --trusted-host pypi.douban.com -r requirements.txt

4.3 定制启动fastapi服务docker-compose.yml:

version: '3.7'

services:
  api:
    build: .
    container_name: "fastapitest-api-container"
    command: uvicorn app.main:app --host 0.0.0.0 --port 8080 --reload
    restart: always
    ports:
      - "8980:8080"
    volumes:
      - /data/pythonfastapitest :/usr/src/fastapi
    depends_on:
      - db

  db:
    image: postgres:12.0-alpine
    container_name: "container-db"
    volumes:
      - postgres_data:/var/lib/postgresql/data/
    environment:
      - POSTGRES_USER=postgres
      - POSTGRES_PASSWORD=123456
      - POSTGRES_DB=ceshi
    expose:
      - 5432

volumes:
  postgres_data:

4.4 定义.drone.yml流水线:

流水线执行流程(我自己的订的!不一定合适你):

  • 1:默认的会自己再workspace临时工作区(执行完成后会删除)内自动进行git clone,(也可以自定义)

  • 2: 把拉取最新仓库的代码拷贝到宿主机的某个目录下

  • 3:通过rone-ssh插件进行和宿主机通信,并执行相关的命令

kind: pipeline # 定义对象类型,还有secret和signature两种类型
type: docker # 定义流水线类型,还有kubernetes、exec、ssh等类型
name: 测试克隆 # 定义流水线名称

# 自订购克隆工作区路径-仅是临时的工作区,执行完成流水线后会自动的进行关闭
workspace:
  path: /drone/src

steps: # 定义流水线执行步骤,这些步骤将顺序执行
  # 将当前拉取下来的工作区内(克隆下来的)的文件,转移到宿主机上
  - name: code-scp
    image: appleboy/drone-scp
    settings:
      host: 192.168.219.131 # 远程连接地址
      username: root # 远程连接账号
      password: 123456
      port: 22 # 远程连接端口
      # 转移到宿主机的某个目录下
      target: /data/fatest
      # 拷贝当前工作区内的相关的所有文件(git拉取下来的项目文件)
      source: .

  # 部署项目
  - name: code-deploy
    image: appleboy/drone-ssh # 链接宿主机的SSH插件镜像
    settings:
      host: 192.168.219.131 # 远程连接地址
      username: root # 远程连接账号
      password: 123456
      port: 22 # 远程连接端口
      # 相关的命令的执行
      script:
        - cd /data/fatest
        # 每次发布更新代码都需要重新构建新的镜像!因为我们的代码是复制到镜像里面去的!
        #- docker-compose stop && echo y | docker-compose rm && docker rmi fatest_api:latest
        - docker-compose stop && docker-compose up -d --build
        # 不要这样写!- docker-compose up --build && docker-compose up -d
         
  - name: notify
    image: drillster/drone-email
    settings:
      host: smtp.qq.com      # 例如 smtp.qq.com
      port: 465  #  例如QQ邮箱端口465
      username: 308711822@qq.com  # 邮箱用户名
      password: 输入你自己的啊!!!!  # 邮箱密码
      subject: "Drone build: [{{ build.status }}] {{ repo.name }} ({{ repo.branch }}) #{{ build.number }}"
      from: 308711822@qq.com
      skip_verify: true
      recipients_only: true  # 只发送给指定邮件收件人,不默认发送给流水线创建人;
      recipients: [ 308711822@qq.com]
    when: # 执行条件
      status: [ changed, failure, success]

注意事项点:

  • 1:docker-compose up -d --build 需要后台启动,前台启动少-d的话流水线无法往下执行
  • 2:注意fastapi容器内的开启的端口访问和映射端口的不同!
  • 3:其实上面的写死的相关的账号信息等是不合理,通常我们的是需要把写入到我们的DroneSecrets秘钥信息管理中,然后从里面去获取:
  • DroneSecrets秘钥信息管理 流程:

1)建立对应的键值对: image.png

image.png

image.png

image.png

2)修改对应流水线配置,从秘钥信息里面对象:

image.png

5:执行提交我们的代码到仓库

image.png

6:查看流水构建情况:

image.png

image.png

image.png

7:构建完成后,访问我们的fastapi服务的接口

其实就是使用docker-compose启动而已!

访问地址为:http://192.168.219.131:8980/

image.png

验证测试,再修改一下我们的代码,再提交一次!

image.png

执行完成后再访问:

image.png

8:需优化的地方点

  • 1:镜像构建过程避免重复下载问题
  • 2:流水线执行过程中,转移代码的问题
  • 3:应该是把构建新的镜像推送到仓库管理里面

9:一些问题处理

问题1 Couldn't connect to Docker daemon:

遇到无法:

ERROR: Couldn't connect to Docker daemon at http://0.0.0.0:2375 - is it running?

通常是服务没启动,如果是已经启动了还是报错的情况下,通常就是你的配置的docker的进程.sock找不到,或者自定义的时候出错了!需要仔细检测!

一般如果是没重启直接的进行重启一下docker服务即可:

 systemctl daemon-reload && systemctl restart docker

问题2Gogs的web钩子的配置:

Drone使用的过程一些小笔记:

1:开启相关Drone服务之后,不需要手动再进行Gogs的web钩子的配置,只需要进行drone项目下的同步激活配置即可:

1)drone未激活前:

image.png

2)drone同步:

image.png

image.png

3)刷新查看钩子配置(已自动的配置):

image.png

4)测试验证推送:

image.png

问题3:关于drone一些原理基础

  • drone通过的仓库激活后,则会再对应的仓库上进行自动的配置一个webhook,无需手动再仓库配置(除非你需要自己定义这个webhook,)只有激活配置后,仓库的更新之后才会通知drone执行相关的流水线任务。
  • .drone.yml 的文件主要是用于描述构建与部署的流程
  • drone每个步骤就是个容器,每个插件也是个容器,各种组合来进行相关脚本的执行,不管编译,提交到镜像仓库,部署,通知等功能都是由镜像的功能
  • drone 针对不同类型的runner还有不一样的执行器类型,使用需要使用特点的类型处理相关逻辑
  • pipeline只是负责把容器启动,至于容器做什么任务的系统不关心

问题4 把临时工作区挂载宿主机目录

这个操作是不合理滴!!也无法执行!

最后的建议:

看官网文档吧!!!版本不一样的话,很多的东西都有所区别!!


以上仅仅是个人结合自己的实际需求,做学习的实践笔记!如有笔误!欢迎批评指正!感谢各位大佬!

结尾

END

简书:www.jianshu.com/u/d6960089b…

掘金:juejin.cn/user/296393…

公众号:微信搜【小儿来一壶枸杞酒泡茶】

小钟同学 | 文 【原创】【欢迎一起学习交流】| QQ:308711822