在 Mac 上使用 Docker 搭建统一的容器化开发环境,基于 Debian 13 (Trixie) Slim 基础镜像。
集成 Go、Node.js/TypeScript、Python3 开发工具链与国内镜像源,并处理了 SSH 远程登录、/root 卷挂载覆盖保护等细节。
Dockerfile
1# 容器化开发环境
2# Debian13 slim 基础镜像
3FROM debian:13-slim
4
5# 运行时环境变量
6ENV LANG=C.UTF-8 \
7 LANGUAGE=C.UTF-8
8
9# 更新APT 安装系统基础工具
10RUN apt-get update \
11 && apt-get install -y --no-install-recommends \
12 ca-certificates curl git nano openssh-client openssh-server unzip zip vim wget \
13 && apt-get autoremove -y \
14 && apt-get clean
15
16# Git与SSH配置
17RUN git config --system tag.gpgSign false \
18 && git config --system commit.gpgsign false \
19 && mkdir -p /run/sshd \
20 && sed -i 's/^#*PermitRootLogin.*/PermitRootLogin yes/' /etc/ssh/sshd_config \
21 && sed -i 's/^#*PasswordAuthentication.*/PasswordAuthentication yes/' /etc/ssh/sshd_config
22
23# 安装语言环境 运行时
24ENV PATH=$PATH:/usr/local/go/bin:/root/go/bin:/root/.local/bin
25
26# 缓存目录 统一放/cache 不挂载 走容器内原生文件系统 随容器删除一起回收
27ENV GOMODCACHE=/cache/go-mod \
28 GOCACHE=/cache/go-build \
29 npm_config_cache=/cache/npm \
30 PIP_CACHE_DIR=/cache/pip
31
32# 配置Python 解除 system pip limit 配置pip镜像
33ENV PIP_BREAK_SYSTEM_PACKAGES=1
34
35RUN apt-get install -y --no-install-recommends python3 python3-pip \
36 && pip3 config set --global global.index-url https://pypi.tuna.tsinghua.edu.cn/simple
37
38# GO 安装与配置国内镜像和工具链 自适应架构
39ARG GOLANG_VERSION=1.27.1
40
41RUN arch="$(dpkg --print-architecture)" \
42 && wget -q https://go.dev/dl/go${GOLANG_VERSION}.linux-${arch}.tar.gz \
43 && tar -C /usr/local -xzf go${GOLANG_VERSION}.linux-${arch}.tar.gz \
44 && rm -f go${GOLANG_VERSION}.linux-${arch}.tar.gz \
45 && go env -w GOPROXY=https://goproxy.cn,direct \
46 && go install -v golang.org/x/tools/gopls@latest \
47 && go install -v github.com/go-delve/delve/cmd/dlv@latest \
48 && go install -v honnef.co/go/tools/cmd/staticcheck@latest \
49 && go clean -modcache \
50 && go clean -cache
51
52# 配置GOPATH
53ENV GOPATH=/root/go
54
55# 配置Nodejs与TS 配置镜像源
56RUN curl -fsSL https://deb.nodesource.com/setup_24.x | bash - \
57 && apt-get install -y --no-install-recommends nodejs \
58 && apt-get autoremove -y \
59 && apt-get clean \
60 && npm config set registry https://registry.npmmirror.com --location=global \
61 && npm install -g typescript ts-node \
62 && npm cache clean --force
63
64# shell增强:补全 (bash-completion)
65RUN apt-get update \
66 && apt-get install -y --no-install-recommends bash-completion \
67 && apt-get autoremove -y \
68 && apt-get clean \
69 && printf '%s\n' \
70 '' \
71 '# bash-completion: 终端窗口(交互式非登录 shell)也启用补全' \
72 'if ! shopt -oq posix; then' \
73 ' if [ -f /usr/share/bash-completion/bash_completion ]; then' \
74 ' . /usr/share/bash-completion/bash_completion' \
75 ' elif [ -f /etc/bash_completion ]; then' \
76 ' . /etc/bash_completion' \
77 ' fi' \
78 'fi' \
79 >> /etc/bash.bashrc
80
81# AI工具:可根据需要补充(如 Claude Code 等工具推荐运行在容器内)
82
83# 备份 /root,防止 volume 挂载覆盖镜像内文件
84RUN set -eux; \
85 mkdir -p /root-defaults; \
86 cp -a /root/. /root-defaults/
87
88# 入口脚本 启动时恢复 /root 并注入 git ssh 配置
89COPY mac.entrypoint.sh /usr/local/bin/entrypoint.sh
90RUN chmod +x /usr/local/bin/entrypoint.sh
91
92WORKDIR /workspace
93EXPOSE 22222
94CMD ["/usr/local/bin/entrypoint.sh"]
设计要点与细节
- 统一缓存目录 (
/cache):- 将
GOMODCACHE、GOCACHE、npm_config_cache、PIP_CACHE_DIR统一重定向到容器内的/cache。 - 不作外部挂载,直接走容器内原生文件系统读写,避免 Mac 下 bind mount 跨文件系统的高 I/O 开销,随容器生命周期自动释放。
- 将
- 多架构支持 (
arch):- 下载 Go SDK 时通过
dpkg --print-architecture自适应适配 Apple Silicon (arm64) 与 Intel (amd64)。
- 下载 Go SDK 时通过
- 国内源与加速:
- Python 配置清华源并开启
PIP_BREAK_SYSTEM_PACKAGES=1。 - Go 启用
goproxy.cn并预装 LSP 与调试工具(gopls、dlv、staticcheck)。 - Node.js 24 + npmmirror 镜像源,全局安装 TypeScript/ts-node。
- Python 配置清华源并开启
- 卷挂载保护 (
/root-defaults):- 镜像构建阶段将
/root复制一份到/root-defaults。 - 启动时由
mac.entrypoint.sh检测并恢复缺失的默认配置,防止外部 volume 挂载覆盖容器内原有的环境配置。
- 镜像构建阶段将