You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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-uid 
    
  • docker images结果:
    REPOSITORY: my_app_devcontainer-app 
    REPOSITORY: vsc-my_proj-64ad9a6809f39eaa523af6a319f22b90b2d1358fe3a8aebc93ac1dfaebf5f22a-uid
    

疑问:

  1. 出现两个镜像的原因是什么?是否属于重复构建?
  2. 能否通过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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 21:35:20