VSCode Dev Containers为何构建两个镜像?如何指定镜像名?
问题描述
使用VS Code Remote Container作为开发环境,项目包含Dockerfile、docker-compose.yml和devcontainer.json,VS Code可正常构建、启动容器并挂载代码。但在Linux主机执行docker ps仅看到1个运行容器,docker images却显示2个镜像,其中长名称镜像为实际启动容器使用的镜像。
相关配置文件
docker-compose.yml
app: container_name: my_app build: context: .. dockerfile: .devcontainer/Dockerfile volumes: - ../..:/workspaces:cached
devcontainer.json
{ "name": "my_app_service", "dockerComposeFile": "docker-compose.yml", "service": "app", "workspaceFolder": "/workspaces/${localWorkspaceFolderBasename}", "customizations": { "vscode": { "extensions": ["ms-python.python"] }, "settings": { "terminal.integrated.shell.*": "/bin/bash" } } }
Docker命令输出
docker ps结果:container name: my_app image: vsc-my_proj-64ad9a6809f39eaa523af6a319f22b90b2d1358fe3a8aebc93ac1dfaebf5f22a-uiddocker images结果:REPOSITORY: my_app_devcontainer-app REPOSITORY: vsc-my_proj-64ad9a6809f39eaa523af6a319f22b90b2d1358fe3a8aebc93ac1dfaebf5f22a-uid
疑问:
- 出现两个镜像的原因是什么?是否属于重复构建?
- 能否通过
docker-compose或devcontainer.json指定镜像名称?
解答
一、两个镜像的产生原因
这是VS Code Remote Containers插件的正常行为,不属于重复构建:
- 第一个镜像
my_app_devcontainer-app:是docker-compose严格按照你配置的Dockerfile构建出的基础镜像,仅包含你定义的项目运行环境。 - 第二个长名称镜像
vsc-my_proj-xxx-uid:是插件在上述基础镜像之上,额外添加了VS Code远程开发必需的组件(如SSH服务、用户权限适配、插件运行依赖等)后生成的定制化运行时镜像,实际启动的容器基于这个镜像,以保证VS Code能正常连接并提供远程开发功能。
插件会自动对docker-compose构建的基础镜像做二次封装,所以会生成两个镜像,基础镜像可作为缓存,加速后续环境重建。
二、指定镜像名称的方法
1. 给docker-compose构建的基础镜像指定名称
直接在docker-compose.yml的app服务配置中添加image字段,自定义基础镜像的仓库名和标签:
app: container_name: my_app build: context: .. dockerfile: .devcontainer/Dockerfile image: my-custom-app:dev # 自定义基础镜像名称 volumes: - ../..:/workspaces:cached
配置后,docker-compose build生成的基础镜像就会是你指定的my-custom-app:dev,不再是自动生成的my_app_devcontainer-app。
2. 关于插件生成的运行时镜像名称
Remote Containers插件目前没有提供直接配置运行时长镜像名的选项,这个名称是插件根据项目路径、用户ID等信息自动生成的,用于区分不同项目的远程开发镜像。如果不需要保留这个镜像,可在停止容器后手动删除,或者利用Docker的镜像清理命令(如docker image prune)清理无用镜像。
内容的提问来源于stack exchange,提问作者mike01010
相关产品推荐
相关产品推荐

