第一步:保证自己的py脚本在本地可以运行起来服务。
比如这次我想 把 方案一_输煤栈桥异物检测_正式版 的 本地 按运行可以 run的一个foreign_OD_service1_trail.py ,如下:
第二步:加载镜像,和创建容器
第二步:创建算法镜像
把算法工程拷贝到/data目录
我这边是 虚拟机,我先把 脚本 拷贝 到 VMware的共享文件夹 D:\VMSharedFolders,然后进
虚拟机 Ubuntu 把 文件拷贝到
记得要创建新的算法镜像,需要修改三个文件,分别依次是 :
Dockerfile , start.sh , run_server.sh
第一个:Dockerfile
FROM 5121a6577a7f
COPY start.sh /root/start.sh
RUN chmod +x /root/start.sh
WORKDIR /root
ENTRYPOINT /root/start.sh && tail -f /dev/null
FROM 5121a6577a7f,表示我的基础镜像,这里我选用最开始上传的那个基础镜像,也就是 15 months ago的,而不是 12天前的,因为那些是 我 生成的服务的镜像。
内容修改如下,并剪切到 /data/xxx/,这里为/data/foreign_OD
FROM 5121a6577a7f
COPY start1.sh /root/ start1.sh
RUN chmod +x /root/ start1.sh
WORKDIR /root
ENTRYPOINT /root/start1.sh && tail -f /dev/null
第二个:start.sh
#!/bin/bash
sleep 3
cd /data/fire_yolo && sh run_server.sh
第一次生成的start.sh在 /data/docker_auto_start/。
名字改成 start1.sh,内容修改如下,并剪切到 /data/xxx/,这里为/data/foreign_OD
#!/bin/bash
sleep 3
cd /data/ foreign_OD
第三个:run_server.sh
#!/bin/bash
nohup python3 run_fire_detect.py >>./run_server.log 2>&1
内容修改如下,并剪切到 /data/foreign_OD/
#!/bin/bash
nohup python3 foreign_OD_service1_docker.py >>./run_server.log 2>&1
cd 到 /data/foreign_OD/ 、在目录下执行
sudo docker build -t foreign_OD_service1_testv0:1 .
这里注意一下,就是 Dockerfile 的名字 不能 为 Dockerfile2 什么的,不然提示找不到文件,是Dockerfile2 的 要改回来。命令:
cp Dockerfile2 ./Dockerfile
G、执行sudo docker images并记录下添加了自启动脚本的新镜像的IMAGE ID
创建docker容器
最后通过 可以启动起来 服务。
sudo docker run -itd --name foreign_od_service1_testV --network host -v /data:/data -v /tmp/.X11-unix:/tmp/.X11-unix -e DISPLAY=:0 -e PYTHONIOENCODING=utf-8 --restart=no ba53d98a9ac3
或者
sudo docker run -itd --name yuto_algorithm --network host -v /data:/data -v /tmp/.X11-unix:/tmp/.X11-unix -e DISPLAY=:0 -e PYTHONIOENCODING=utf-8 --restart=always cbc8879a04a0
关于docker容器里时间和宿主机不一致的问题:
您可以在启动容器时,使用参数"-v /etc/localtime:/etc/localtime:ro"来将宿主机的时间同步到容器内部。具体操作可以参考以下命令:
docker run -v /etc/localtime:/etc/localtime:ro <image_name> <command>
其中,<image_name>是您要启动的镜像名称,<command>是您要在容器内部执行的命令。
sudo docker run -itd --name yuto_algorithmV4 --network host -v /data:/data -v /etc/localtime:/etc/localtime:ro -v /tmp/.X11-unix:/tmp/.X11-unix -e DISPLAY=:0 -e PYTHONIOENCODING=utf-8 --restart=no 91c25b480615
注:这个命令中的 /data:/data 表示将本地的 /data 目录挂载到 Docker 容器中的 /data 目录,前面的 /data 是本地路径,后面的 /data 是 Docker 容器中的路径。
最开始的我的Ubuntu下的路径是:
打包 Dockerfile start.sh 两个文件的路径在:
/data/docker_auto_start
代码路径在:
/data/fire_yolo_n
疑虑点二:
我在 Dockerfile 里用 下面这句失败了,
# 将本地文件夹拷贝到 Docker 镜像中
COPY /home/lenovo/managerAPI/foreignODdjango /root/
,而观察到 yuto 起docker服务的方式是这样子的,
step1: 先把 docker 里 /data 和 本地的 /data 关联起来。
step2: 在 start.sh 里,用 cd /data/fire_yolo && sh run_server.sh 运行 保存在本地python脚本,所以根本不需要再拷贝 foreignODdjango 文件夹至 docker内。
至于怀疑这样起的服务 是否 是不是 docker 里的进程,用下面方式,我已经验证确实是属于 docker里的进程。
怎么确定,用起的服务是位于 docker 里的进程。
您可以使用以下命令来查看 Docker 容器中运行的进程:
docker top <container_id>
同时进入 docker 里,使用以下命令来查看运行的进程详细信息:
ps aux
Django的服务一直起不来,后来进 docker服务后发现,是
bash run_server.sh 报错,改成下面这句是可以 work的,记录一下。
nohup python3 manage.py runserver 8085 >./run_server23.log 2>&1 &
这次备注:
用 0.0.0.0:8050 启动一个 Django服务,则本地任意IP + 该端口(8050)可以访问该服务。
或者局域网内其他主机 通过 宿主机的 IP + 该端口(8050) 可以访问该服务。
nohup python3 manage.py runserver 0.0.0.0:8050 >./run_server8050.log 2>&1 &