用 Emacs 写代码时,最怕ref="/tag/271/" style="color:#C468A7;font-weight:bold;">环境不一致导致程序在本地跑得好好的,一到服务器就出问题。这时候 Docker 就派上用场了,而把 Emacs 和 Docker 配合起来,既能保持编辑器的高效,又能隔离环境,特别适合做项目交接或者团队协作。
安装 Docker 支持插件
Emacs 本身不带 Docker 管理功能,但可以通过 docker-tramp 插件直接访问容器里的文件。只要装上它,你就能像打开本地文件一样打开容器内的配置文件,改完保存即生效。
(use-package docker-tramp
:ensure t)
装好后,在 Emacs 里按 C-x C-f,输入 /docker:root@container_name:/path/to/file,就能进入指定容器编辑文件。比如你在跑一个叫 webapp 的容器,想改它的 Nginx 配置,就这么写:
/docker:root@webapp:/etc/nginx/nginx.conf
结合 Magit 操作容器化项目
如果你用 Magit 管理代码,配合 Docker 更是顺手。比如本地测试时启动一个数据库容器,开发环境完全干净。启动 MySQL 容器的命令可以写进 shell 脚本,一键运行:
docker run --name dev-mysql -e MYSQL_ROOT_PASSWORD=123456 -d mysql:8.0
然后在 Emacs 里用 shell 或 eshell 启动它,调试时直接连进去查数据,不用在终端和编辑器之间来回切换。
用 LSP 连接容器内语言服务
有些项目要求 LSP(Language Server Protocol)必须在特定环境中运行,比如 Python 依赖某个版本的虚拟环境。可以把语言服务器放在容器里,Emacs 通过 lsp-mode 连过去。
例如,构建一个包含 pylsp 的镜像:
FROM python:3.9-slim
RUN pip install python-lsp-server
CMD ["pylsp"]
启动容器后,用 lsp-bridge 或自定义配置连接标准输入输出,Emacs 就能获得补全和跳转支持。
日常使用小技巧
我常在一个项目目录下放一个 docker-compose.yml,开发时直接 docker-compose up 启动全套服务。Emacs 里用 compile 命令绑定快捷键,一键构建和重启。
(defun my/docker-up ()
(interactive)
(compile "docker-compose up --build"))
改完代码想验证?按个键就行,不用离开编辑器。时间久了你会发现,越复杂的项目,这种组合越省心。