在docker中运行引用了gdal库的Python程序 - docker 容器 gdal

news/2025/1/24 15:08:59/文章来源:https://www.cnblogs.com/love-zf/p/18689538

# 前言


需要将一个包含了gdal环境的Python开发环境, 并且部署到docker容器中,
这么通用的一个功能, 为啥网上资源这么少, 又这么麻烦,
GDAL在Python中不是用的挺多的嘛 ~ 
搞得时候, 一个坑接着一个坑, 爬坑最扰人 ~

1.gdal篇 : gdal镜像 + gdal容器


# 镜像 - 下载 `gdal` 的最新小型 Ubuntu 镜像
sudo docker pull ghcr.io/osgeo/gdal:ubuntu-small-latest# 容器 - 运行 `gdal` 容器:
# - `-itd`:交互式运行容器,分配伪终端,并在后台运行。
# - `--name gdal_lx`:为容器指定名称为 `gdal_lx`。
# - `ghcr.io/osgeo/gdal:ubuntu-small-latest`:使用 `gdal` 的最新小型 Ubuntu 镜像。
sudo docker run -itd --name gdal_lx ghcr.io/osgeo/gdal:ubuntu-small-latest

2.gdal & python篇 : 在gdal容器中安装python环境


# 进入容器 `gdal_lx` 
sudo docker exec -it gdal_lx /bin/bash# 进入容器 `gdal_lx` 并且安装 Python 环境 ( 注意,以下命令是在gdal_lx容器中运行的 )
# 容器 `gdal_lx` 中 - 更新源
apt-get update# 容器 `gdal_lx` 中 - 安装Python3
apt-get install python3# 容器 `gdal_lx` 中 - 安装pip3
apt-get install pip# 容器 `gdal_lx` 中 - 查看Python版本
python --version# 将当前运行的 `gdal_lx` 容器保存为新镜像:
# - `-a "zf"`:指定作者为 "作者名称"。
# - `-m "gdal contain python"`:添加提交描述信息。
# - `gdal_lx`:源容器名。
# - `gdal_python_lx_image:v1`:新镜像的名称和版本号。
sudo docker commit -a "作者名称" -m "gdal contain python" gdal_lx gdal_python_lx_image:v1

整理这篇文章的时候, 我还处于各种尝试, 所以命令没有留下来,

我是发现这种方法行得通的时候, 回过头来整理这篇文档的,

命令我都是查的历史命令来看的, 包括在这个gdal_lx容器中指令命令历史,

我也是再次进入这个容器, 查找的历史命令( 庆幸这个容器还保留着 !)

下面是查找最近1000条不重复的命令

1.查找命令, 并保存到文件commands.txt

history | awk '{ $1=""; print $0 }' | tac | awk '!seen[$0]++' | tac | tail -n 1000 > commands.txt

2.查看具体命令

cat commands.txt

3.根据包含了gdal&python环境的镜像{gdal_python_lx_image:v1}生成服务镜像

# 准备工作1.
编写好Dockerfile2.
将Python项目的文件放到这个目录` /home/test/services/cogtif_data_service ` 下( 这个目录下,要有Dockerfile,main.py,,,)
# 执行命令
cd /home/test/services/cogtif_data_service# 根据当前目录下的 Dockerfile 构建一个名为 `cogtif_data_service` 的镜像:
# - `-t cogtif_data_service`:指定镜像的名称和标签。
# - `.`:上下文路径为当前目录。
sudo docker build -t cogtif_data_service .# 运行一个基于 `cogtif_data_service` 镜像的容器:
# - `-d`:后台运行。
# - `--name cogtif_data_service`:容器命名为 `cogtif_data_service`。
sudo docker run -d --name cogtif_data_service cogtif_data_service# 查看 `cogtif_data_service` 容器的最近 222 行日志。
sudo docker logs --tail 222 cogtif_data_service
# 项目目录大概是这个样子:project_name/
├── src/                        # 主代码目录
│   ├── __init__.py             # 包初始化文件
│   ├── main.py                 # 项目的入口文件
│   ├── module1/                # 模块1
│   │   ├── __init__.py
│   │   └── module1_file.py
│   └── module2/                # 模块2
│       ├── __init__.py
│       └── module2_file.py
├── tests/                      # 测试代码
│   ├── __init__.py
│   ├── test_module1.py         # 测试模块1的代码
│   └── test_module2.py         # 测试模块2的代码
├── requirements.txt            # 项目依赖文件
├── Dockerfile                  # 生成镜像的时候需要的
├── .gitignore                  # Git忽略规则文件
├── main.py                     # 项目入口
└── LICENSE                     # 开源协议(如果需要)

# Dockerfile内容 : FROM gdal_python_lx_image:v1# 设置工作目录
WORKDIR /app# 将当前项目代码拷贝到工作目录
COPY . /app# 升级 pip
RUN apt-get update
RUN apt-get install -y pip# 解决一个错误
RUN mv /usr/lib/python3.12/EXTERNALLY-MANAGED /usr/lib/python3.12/EXTERNALLY-MANAGED.bkRUN pip install numpy --ignore-installed numpy# 安装依赖
RUN pip install --no-cache-dir -r requirements.txt# 定义容器启动命令
CMD ["python", "main.py"]

在这一步, 其实遇到的问题最多, 安装的时候, 除了这个gdal和python的问题,

还有安装包依赖的问题, 各种报错, 主要是包的版本问题, 和包中依赖的一些包版本问题,

总结.

总结下思路,
1.先搞一个gdal的镜像, 并且运行起来这个gdal环境的容器, 我们称之为{gdal容器},
2.在{gdal容器}中安装python开发环境,现在这个{gdal容器}已经超进化到了{gdal,python二合一容器}
3.将{gdal,python二合一容器}提交为一个镜像 {gdal,python二合一镜像}, 在Dockerfile中就使用这个镜像
4.编写的Dockerfile中使用的就是这个{gdal,python二合一镜像},构建一个新的镜像, 并运行为容器

需要要有化整为零的思维, 

踩坑-1-


# 去官网上搜索gdal, 会出现一个Star比较多的一个仓库 : "https://hub.docker.com/r/osgeo/gdal/tags"
# 选择好了Tag, 然后直接复制上面的命令,比如"sudo docker pull osgeo/gdal:ubuntu-full-3.6.2",执行的时候却报错!错误如下sudo docker pull osgeo/gdal:ubuntu-full-3.6.2
Error response from daemon: Get "https://registry-1.docker.io/v2/": net/http: request canceled while waiting for connection (Client.Timeout exceeded while awaiting headers)# 我尝试更换docker源还是不行,最后使用这个命令才能下载下来 ! 
sudo docker pull ghcr.io/osgeo/gdal:ubuntu-small-latest搜了下, 主要区别是镜像来源,
osgeo/gdal 是 GDAL 官方提供的镜像( 所以网络不通 ? )
ghcr.io/osgeo/gdal 是存放在 GitHub Container Registry 的镜像(官方也在维护)。( 只要能访问到GitHub,就能docker pull 下来? )

摘抄文档

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Python基础6——装饰器(续) 递归 模块

1.函数1.1 参数当默认参数的值为可变类型时慎用# 不推荐使用以下代码 def func(data, value=[]):pass可以将默认参数的值改为None# 推荐使用以下代码 def func(data, value=None):if not value:value = []案例def func(data, value=[]):value.append(data)return valuev1 = fun…

C# Winform 在 Pancel 上绘制矩形

在C#的WinForms应用程序中,Panel控件本身不直接支持绘图功能,因为它不是一个绘图控件。不过,你可以通过在Panel上覆盖(override)OnPaint方法或者使用Graphics对象来在Panel上绘制图形。下面是如何实现这两种方法的示例: 方法1:覆盖OnPaint方法 可以通过重写Panel的OnPai…

SpringBoot使用SSE流,打tar包发版后出现问题

SpringBoot使用SSE流,打tar包发版后出现问题 以下纯个人实践,如有问题,还望指正~ 出现的问题 出现原因:本地调试SSE推送数据没有问题,但是通过打包为tar包发版之后,出现了以下报错: 主要问题就是: java.lang.IllegalArgumentException: Async support must be enabled …

【每日一题】20250124

读书就是这样好,无论心不在焉,板着长脸,只要考试及格,就是一个及格的人。【每日一题】 1.(20分) \(\hspace{0.6cm}\)如图所示,质量 \(M=2 \; \mathrm{kg}\) 的滑块套在光滑的水平轨道上,质量 \(m=1 \; \mathrm{kg}\) 的小球通过长 \(L=0.5 \; \mathrm{m}\) 的轻质细杆与…

Golang sync.pool源码解析

sync.Pool 是 Go 中用于对象复用的工具,可减少频繁创建和销毁对象的开销,从而优化内存使用和降低 GC 压力。本文通过分析其用法、真实案例及源码结构,详细解读了 sync.Pool 的读写流程及其背后的高效设计思想,为性能优化提供了实用参考。Golang sync.pool源码解析 - sync.p…

从靶场到实战:双一流高校多个高危漏洞

本文结合其它用户案例分析讲解挖掘某双一流站点的过程,包含日志泄露漏洞深入利用失败,到不弱的弱口令字典进入后台,再到最后偶遇一个貌似只在靶场遇到过的高危漏洞。本文结合其它用户案例分析讲解挖掘某双一流站点的过程,包含日志泄露漏洞深入利用失败,到不弱的弱口令字典…

Nginx 架构和安装

1.1 Nginx 概述 1.1.1 Nginx 介绍 Nginx:engine X ,2002年开发,分为社区版和商业版(nginx plus ) 2019年3月11日 F5 Networks 6.7亿美元的价格收购 Nginx是免费的、开源的、高性能的HTTP和反向代理服务器、邮件代理服务器、以及TCP/UDP代理服务器 解决C10K问题(10K Connect…

Linux命令大全-快速查询手册

访问地址: 线上访问:https://git.io/linux 开源社区:https://github.com/jaywcjlove/linux-command 简要介绍: Linux 命令大全搜索工具,内容包含 Linux 命令手册、详解、学习、搜集,中文解释,支持背景切换。主要功能: 当前仓库搜集了 580 多个 Linux 命令,是一个非盈利…

IPTVnator - 最方便的开源 IPTV 播放器

IPTVnator 是一款视频播放器应用程序,提供对 IPTV 播放列表播放(m3u、m3u8)的支持。该应用程序允许用户使用远程 URL 或从本地文件系统上传文件来导入播放列表。此外,它还支持 XMLTV 格式的 EPG 信息,可以通过 URL 提供。该应用程序是一个使用 Electron(目前正在迁移到 T…

中电金信首次通过数据管理能力成熟度(DCMM)四级认证

日前,中国电子信息行业联合会发布《关于公布获得数据管理能力成熟度等级证书单位的通知(第十四批)》,中电金信正式通过数据管理能力成熟度(DCMM)等级认定——量化管理级(4级)。DCMM即数据管理能力成熟度评估模型(Data management Capability Maturity Model),是我国首…

执子之手与子偕老:镌刻在时光深处的爱情传奇

执子之手与子偕老:镌刻在时光深处的爱情传奇“死生契阔,与子成说。执子之手,与子偕老。” 这出自《诗经・邶风・击鼓》的千古名句,如同一首跨越千年的悠扬情歌,萦绕在人类情感的天际,描绘出爱情最纯粹、最美好的模样,承载着人们对永恒相伴、不离不弃的深深期许。它不仅仅…

二维数点问题

二维数点问题。P10814 【模板】离线二维数点 询问区间 \([l,r]\) 内,在值域为 \([0,x]\) 中数的个数。 想象这是个二维平面,我们要求的就是矩形内点的个数。通常用 cdq 做,将询问拆成两个点,将点按照x坐标排序,按照y坐标加入到树状数组中(为了满足第二条限制),这时就依次…