Dev Container 技巧
与 VS Code 紧密配合,让开发效率提高。
看过微软的一个技术分享演讲视频,微软内部也是用 Dev Container 配置本地开发环境的。虽然未大规模得到推广,但足够可用。
https://code.visualstudio.com/docs/devcontainers/containers

官方整理的技巧
https://code.visualstudio.com/docs/devcontainers/tips-and-tricks
提前拉取镜像
微软的网站和资源在国内总是很慢,这次他们没有把 Dev Container 官方镜像放 Docker Hub,直接无法访问。需要手动提前拉取该镜像,开科学上网,然后 docker pull mcr.microsoft.com/devcontainers/base:focal
相关链接:
- 可用的 DevContainer 镜像 名称:https://hub.docker.com/_/microsoft-devcontainers?tab=description
- 镜像源地址:https://github.com/devcontainers/images
不要用 forwardPorts(WSL 里访问不到)
若开发环境是 windows 和 wsl2 结合,devcontainer 自动给我们做的端口转发是在 windows 主机的,会导致 wsl 里面访问不到该端口。 解决方法是:runArgs 里面设置容器启动参数,例如:[ "--publish=8201:20" ] ,让运行在 wsl 下的 docker 帮我们吧端口映射到 wsl 子系统中。又由于 windows 下请求 localhost:xxx 会自动关联到 wsl 相应本地端口,最终实现了 devcontainer 开发环境下 windows 主系统和 wsl 子系统都能够正常访问我们开发容器内的应用。
Could not connect to ssh-agent on local host
Could not connect to ssh-agent on local host (\.\pipe\openssh-ssh-agent). Make sure the service is running.
在 Dev Container 启动完成后的报错。需要手动检查一下 ssh-agent。
以管理员身份打开 PowerShell,输入 ssh-agent 回车。搞定。总结原因是 ssh-agent 默认是不会自动开启的 ,需要手动触发。
PS C:\WINDOWS\system32> Get-Service ssh-agent
Status Name DisplayName
------ ---- -----------
Stopped ssh-agent OpenSSH Authentication Agent
PS C:\WINDOWS\system32> ssh-agent
PS C:\WINDOWS\system32> Get-Service ssh-agent
Status Name DisplayName
------ ---- -----------
Running ssh-agent OpenSSH Authentication Agent
相关参考:https://code.visualstudio.com/docs/remote/troubleshooting#_setting-up-the-ssh-agent
需要不断地完善适合自己的 Dev Container
只用官方的镜像是不够的,在整个开发过程中,要时刻根据需要在 Dockerfile 中增添一些 RUN。
然而像 RUN apt-get update 等的命令是不能够触发 Layer 缓存机制的。也就是每次 Rebuild 都需要重新执行一次。在项目初期阶段,每天要数十甚至上百次的调试和完善自己的 Dev Container,一直 Rebuild 就会一直有约 1-2 分钟的 apt-get 命令执行时间,如此地重复并没有意义。此时我们就可以拓展思路,自己去达到缓存 RUN apt-get update 执行结果的目的。
方式很简单,独立一个 Image 把固定不变或极少变化的 RUN 先执行。以下是概念示例:
- 二次处理官方镜像
# Dockerfile.apt-ready
FROM ubuntu
RUN apt-get update docker build -f Dockerfile.apt-ready -t ubuntu.apt-ready- 正式的 Dockerfile 使用已经过自己二次处理的镜像:
# Dockerfile
FROM ubuntu.apt-ready