跳到主要内容

关于 Docker,我认输

可乐不卖课
可乐不卖课

· 阅读约 3 分钟

先说清楚,这篇不推荐任何东西,Docker 也不用我推荐。就是记录一下我这周认怂的过程。

我一直不用 Docker。理由当年在视频里讲过,讲得理直气壮,还专门剪了个对比图。核心观点就一句话:本地能跑的东西,为什么要多套一层。现在回头看那句话,说得挺响。

周三晚上接了个活。一个做外贸的朋友,让我把他那个抓数据的脚本搬到服务器上跑,抓几个 B2B 站的产品目录。给钱,不多。我接了——写代码挣的钱,跟卖课不是一回事,没有别的意思,就是说明一下。

脚本是 Python 写的,他在自己 mac 上跑了小半年,稳得很。我说行,环境对齐就行,本地能跑服务器就能跑。

然后就是那条凌晨的报错。

先撞的是 error: externally-managed-environment。他服务器是 Ubuntu 24.04,pip 直接装包会被系统拦下来。这个坑我见过,建个 venv 就过去了,没当事。

建完 venv 重装,撞第二个:ImportError: libGL.so.1: cannot open shared object file。也见过,apt 装 libgl1 就行。装不上。他那台机器没 root,sudo 只开了几个白名单命令。

就开始绕。装 conda 绕,服务器是 ARM 的,conda 那些包下载慢到我想砸键盘。换 pip 源,换镜像。有个包要现场编译,gcc 没装,装 gcc,跟着要 g++,要 python3-dev,每装一个东西带出两个新的。

到十一点半,我盯着终端,发现自己已经在这事上耗的三个多小时,而那个脚本本身,我一行都没看过。

朋友发微信:哥,明天能给客户看吗

就是那一刻我想起 Docker 了。不是想通,是被逼的。其实也不是不会写 Dockerfile,纯粹是懒——打住,不给自己找补,我就是嘴硬。

周四上午装 Docker,写 Dockerfile。base 用 python:3.11-slim,apt 那行装 libgl1,requirements 一装,CMD 一行。build,run,跑起来了。中间改了两处,一处是容器里时区不对,一处是脚本里写死的一个本地路径。

就这么点事。写 Dockerfile 前后不到二十分钟。

不爽的地方也有。第一次 pull 镜像等得我怀疑人生;容器里改代码调试确实不如本地顺手,看日志我还是习惯直接 vim 翻文件;还有构建缓存,我改了 requirements 它没重装,又白折腾了一轮才发现是缓存。这些不是 Docker 的问题,是我不熟。

但服务器那个环境,从今往后炸不炸,跟我没关系了。这个感觉,值。

当年卖课讲到部署那一节,我是真把"本地跑通就行"当经验讲的。现在想起那节课,后背还是发凉。倒不是 Docker 这件事本身,是我那时候什么都不确定,也敢讲。

不吹不黑,Docker 不是银弹,它解决的就是我这么一个具体问题,你的问题可能完全不一样。别看了我这篇就回去把生产环境推倒重来,那你就把我当年那套又学了一遍。

就说到这。

可乐不卖课
可乐不卖课

前技术博主,翻过车。现在只写干货,不带货,别问。

查看主页 →