Bug Report
Description
When using a single docker-compose.yml file with multiple services, each having their own separate .devcontainer/devcontainer.json files, only one service gets its features installed. The service that is started first gets its features correctly installed, while the second service is missing its configured features.
Additionally, using devcontainer up on one service causes the other service's container to be rebuilt, even though they should be independent.
Root Cause
The devcontainer CLI generates a single temporary containerFeatures override file for the entire docker-compose project, instead of generating per-service override files. This temporary file only contains the configuration for the service that was most recently processed, causing the other service's features to be ignored.
Evidence
1. Both containers reference the same temporary file
Container labels show both containers pointing to the identical temporary override file:
com.docker.compose.project.config_files: /var/folders/.../docker-compose.devcontainer.containerFeatures-1777044430151-115a3236-0fb3-4ab5-bdb6-d1baa4463613.yml
2. Temporary file only contains one service's configuration
The temporary override file (docker-compose.devcontainer.containerFeatures-*.yml) only contains configuration for the reportify service:
services:
'reportify':
entrypoint: ["/bin/sh", "-c", "echo Container started\n..."]
labels:
- 'devcontainer.local_folder=/Users/shihaonan/.devcontainer/xiaobangtouzi/reportify'
- 'devcontainer.config_file=/Users/shihaonan/.devcontainer/xiaobangtouzi/reportify/.devcontainer/devcontainer.json'
The duplik service configuration is completely missing from this file.
3. Container metadata confirms missing features
When inspecting the containers:
- reportify container:
devcontainer.metadata label includes Python feature
- duplik container:
devcontainer.metadata label is missing the Python feature
When executing commands inside containers:
- reportify container: Has Python 3.11.15 installed ✓
- duplik container: No Python installed ✗
Configuration
docker-compose.yml (shared by both services)
services:
duplik:
build:
context: ./duplik
dockerfile: Dockerfile
volumes:
- src:/workspaces
command: sleep infinity
reportify:
build:
context: ./reportify
dockerfile: Dockerfile
volumes:
- src:/workspaces
command: sleep infinity
volumes:
src:
duplik/.devcontainer/devcontainer.json
{
"name": "Duplik Development",
"dockerComposeFile": "../../docker-compose.yml",
"service": "duplik",
"workspaceFolder": "/workspaces/duplik",
"features": {
"ghcr.io/devcontainers/features/python:1": {
"version": "3.10"
}
},
"onCreateCommand": "/root/.devcontainer/init.sh",
"postStartCommand": "cd ~/.config/nvim && git pull --rebase",
"overrideCommand": false,
"runServices": [],
"remoteUser": "root"
}
reportify/.devcontainer/devcontainer.json
{
"name": "Reportify Development",
"dockerComposeFile": "../../docker-compose.yml",
"service": "reportify",
"workspaceFolder": "/workspaces/reportify",
"features": {
"ghcr.io/devcontainers/features/python:1": {
"version": "3.11"
},
"ghcr.io/devcontainers-extra/features/poetry:2": {}
},
"onCreateCommand": "/root/.devcontainer/init.sh",
"postStartCommand": "cd ~/.config/nvim && git pull --rebase",
"overrideCommand": false,
"runServices": [],
"remoteUser": "root"
}
Expected Behavior
According to VS Code Dev Containers documentation, it is officially supported to have:
- A single
docker-compose.yml file
- Multiple services
- Each service with its own separate
.devcontainer/devcontainer.json file
Expected: Each service should have its own features installed independently, and starting one service should not cause the other to rebuild.
Actual Behavior
- Only one service gets its features installed (the one that was processed first/last by the CLI)
- The other service is missing all configured features
- Using
devcontainer up on one service causes the other service's container to be rebuilt
Environment
- OS: macOS (Darwin 25.4.0)
- Docker Desktop latest
Bug Report
Description
When using a single
docker-compose.ymlfile with multiple services, each having their own separate.devcontainer/devcontainer.jsonfiles, only one service gets its features installed. The service that is started first gets its features correctly installed, while the second service is missing its configured features.Additionally, using
devcontainer upon one service causes the other service's container to be rebuilt, even though they should be independent.Root Cause
The devcontainer CLI generates a single temporary
containerFeaturesoverride file for the entire docker-compose project, instead of generating per-service override files. This temporary file only contains the configuration for the service that was most recently processed, causing the other service's features to be ignored.Evidence
1. Both containers reference the same temporary file
Container labels show both containers pointing to the identical temporary override file:
2. Temporary file only contains one service's configuration
The temporary override file (
docker-compose.devcontainer.containerFeatures-*.yml) only contains configuration for thereportifyservice:The
duplikservice configuration is completely missing from this file.3. Container metadata confirms missing features
When inspecting the containers:
devcontainer.metadatalabel includes Python featuredevcontainer.metadatalabel is missing the Python featureWhen executing commands inside containers:
Configuration
docker-compose.yml (shared by both services)
duplik/.devcontainer/devcontainer.json
{ "name": "Duplik Development", "dockerComposeFile": "../../docker-compose.yml", "service": "duplik", "workspaceFolder": "/workspaces/duplik", "features": { "ghcr.io/devcontainers/features/python:1": { "version": "3.10" } }, "onCreateCommand": "/root/.devcontainer/init.sh", "postStartCommand": "cd ~/.config/nvim && git pull --rebase", "overrideCommand": false, "runServices": [], "remoteUser": "root" }reportify/.devcontainer/devcontainer.json
{ "name": "Reportify Development", "dockerComposeFile": "../../docker-compose.yml", "service": "reportify", "workspaceFolder": "/workspaces/reportify", "features": { "ghcr.io/devcontainers/features/python:1": { "version": "3.11" }, "ghcr.io/devcontainers-extra/features/poetry:2": {} }, "onCreateCommand": "/root/.devcontainer/init.sh", "postStartCommand": "cd ~/.config/nvim && git pull --rebase", "overrideCommand": false, "runServices": [], "remoteUser": "root" }Expected Behavior
According to VS Code Dev Containers documentation, it is officially supported to have:
docker-compose.ymlfile.devcontainer/devcontainer.jsonfileExpected: Each service should have its own features installed independently, and starting one service should not cause the other to rebuild.
Actual Behavior
devcontainer upon one service causes the other service's container to be rebuiltEnvironment