devcontainers / devcontainers/cli
Multiple services in docker-compose with separate devcontainer.json files - only one service gets features installed
- Dominant language
- TypeScript
- Stars
- 3k
- Forks
- 457
- Avg merge
- 13h 17m
- Merged PRs (30d)
- 6
Description
## 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:
```yaml
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)
```yaml
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
```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
```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](https://code.visualstudio.com/docs/devcontainers/compose#_multiple-docker-compose-devcontainers), 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
Contributor guide
Assessment
This issue has not been assessed yet.