devcontainers / devcontainers/cli

Multiple services in docker-compose with separate devcontainer.json files - only one service gets features installed

Open
#1,211 0 comments 0 reactions 1 assignee Claimed by @v-Kaniska244 View on GitHub
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

Open the contributing guide

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.