导出依赖

正常情况

  • 激活虚拟环境
1
conda activate target_detect
  • 导出依赖包
1
2
3
4
# 第一种(推荐),不包括那些未被安装但已在系统路径中的包
pip list --format=freeze > requirements.txt
# 第二种,包括那些未被显式安装但已在系统路径中的包
pip freeze > requirements.txt

异常情况

  • 大量出现依赖冲突时,可以在linux中用个docker实例来让项目能在虚拟环境中运行,再按正常情况导出依赖
1
2
3
4
5
6
# 搜索镜像
docker search anaconda
# 拉取镜像
docker pull continuumio/anaconda3
# 查看镜像
docker images
1
2
3
4
5
6
7
8
# 实例化镜像并启动
# -i: 以交互模式运行容器,通常与 -t 同时使用;
# -t: 为容器重新分配一个伪输入终端,通常与 -i 同时使用;
# -p: 指定端口映射,格式为:主机(宿主)端口:容器端口
# -d: 让Docker容器以守护形式在后台运行。并且容器所运行的程序不能结束。
docker run --name target_detect_xlh -idt continuumio/anaconda3 /bin/bash
# 进入容器
docker exec -it target_detect_xlh /bin/bash
  • 在该docker实例内,导入windows开发环境中的依赖,并尝试运行项目

    • 第一种,requirements.txt安装

      1
      2
      3
      4
      5
      6
      7
      # 从windows开发环境中导出
      pip list --format=freeze > requirements.txt
      # 将linux目录中的依赖文件复制到容器内的目录下
      docker cp /home/xlh/requirements.txt 5688af83bd4e:/home/xlh/
      # 在容器内的虚拟环境中导入
      pip install -r requirements.txt
      # 有报错就不断pip install ...
    • 第二种,environment.yml安装(容易卡住)

      1
      2
      3
      4
      5
      6
      # 从开发时的虚拟环境中导出environment.yml
      conda env export --no-builds > environment.yml
      # 将linux目录中的依赖文件复制到容器内的目录下
      docker cp /home/xlh/environment.yml 5688af83bd4e:/home/xlh/
      # 到要部署的或docker的target_detect_xlh中导入
      conda env create -f environment.yml

部署

文件准备

  • 项目源文件:将开发的项目代码放大linux服务器上,如/home/xlh/wrj
  • requirements.txt:由上文方法可得,将该文件放到python项目的目录下,如/home/xlh/wrj/requirements.txt
  • Dockerfile文件:创建Dockerfile文件(即Dockerfile,无后缀),放到项目目录下,如/home/xlh/wrj/Dockerfile
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
# Docker image for flask python run
# VERSION 1.0
# 基础镜像使用python:3.8
FROM python:3.8
# 构建工作目录
RUN mkdir /app
# 指定容器工作目录为
WORKDIR /app
# 将服务器 requirements.txt 文件复制到 容器 /project/目录下
COPY requirements.txt requirements.txt
COPY Arial.ttf Arial.ttf
COPY Arial.Unicode.ttf /root/.config/Ultralytics/
# 安装 libgl1-mesa-glx
RUN apt-get update && apt-get install -y libgl1-mesa-glx
# 安装 项目依赖
RUN pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple
# 运行
# 安装pip包
COPY . .
# 将当前文件中的目录复制到/app目录下

ENV FLASK_APP app.py
# 设置环境变量,让flask run 命令能够找到启动文件的位置

CMD ["flask","run","-h","0.0.0.0","-p","5005"]
# 执行启动命名 flask run -h 0.0.0.0 -p 5005 列表中的每个元素之间代表空格

# 编译
# docker build -t weiye/flask-project:v1 .

# run
#docker run -it -p 7090:7090 --name flask-project \
#-v /mydata/flaskProject:/project \
#-d weiye/flask-project:v1

编译镜像

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# 进入到项目目录下
cd /home/xlh/wrj

# 执行,用docker编译镜像 ,xlh/target_detect为镜像名
docker build -t xlh/target_detect .

# 查看所有镜像
docker images

# 启动,构建出镜像实例
docker run -d --name target_detect --restart=always -p 5030:5005 xlh/target_detect

# 查看所有实例
docker ps

# 查看容器的日志输出
docker logs -f target_detect

# 进入容器
docker exec -it target_detect /bin/bash

如何修改代码

​ 将容器发布后,若想修改运行中的代码,则需要如下操作:

停止容器

1
2
# 先找到对应的docker容器id,再停止
docker stop ffd56492d9d4

拷贝代码

1
2
3
4
# 查看容器内代码位置
pwd
# 将最新的被修改的代码拷贝到容器内对应位置
docker cp /home/xlh/wrj/app.py ffd56492d9d4:/app

启动容器

1
2
3
4
# 启动
docker start ffd56492d9d4
# 查看容器的日志输出
docker logs -f target_detect

防火墙问题

  • 若其他网络的主机无法访问相关接口,使用如下命令:
1
iptables -A INPUT -p tcp --dport 7687 -j ACCEPT