Skip to content

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

@shihaonan369

Description

@shihaonan369

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

Metadata

Metadata

Assignees

Labels

No labels
No labels

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions