Verbindung zu mehreren Containern herstellen
Derzeit können Sie nur eine Verbindung zu einem Container pro Visual Studio Code-Fenster herstellen. Sie können jedoch mehrere VS Code-Fenster starten, um eine Verbindung zu ihnen herzustellen.
Wenn Sie stattdessen devcontainer.json verwenden möchten und Docker Compose verwenden, können Sie separate devcontainer.json-Dateien für jeden Dienst in Ihrem Quellcodebaum erstellen, die jeweils auf eine gemeinsame docker-compose.yml verweisen.
Um zu sehen, wie dies funktioniert, betrachten Sie diesen Beispiel-Quellcodebaum
📁 project-root
📁 .git
📁 .devcontainer
📁 python-container
📄 devcontainer.json
📁 node-container
📄 devcontainer.json
📁 python-src
📄 hello.py
📁 node-src
📄 hello.js
📄 docker-compose.yml
Der Speicherort des .git-Ordners ist wichtig, da wir sicherstellen müssen, dass die Container diesen Pfad sehen können, damit die Quellcodeverwaltung ordnungsgemäß funktioniert.
Nehmen Sie als Nächstes an, dass die docker-compose.yml im Stammverzeichnis wie folgt lautet
services:
python-api:
image: mcr.microsoft.com/devcontainers/python:1-3.12-bookworm
volumes:
# Mount the root folder that contains .git
- .:/workspace
command: sleep infinity
# ...
node-app:
image: mcr.microsoft.com/devcontainers/typescript-node:1-20-bookworm
volumes:
# Mount the root folder that contains .git
- .:/workspace
command: sleep infinity
# ...
Sie können dann ./devcontainer/python-container/devcontainer.json für die Python-Entwicklung wie folgt einrichten
{
"name": "Python Container",
"dockerComposeFile": ["../../docker-compose.yml"],
"service": "python-api",
"shutdownAction": "none",
"workspaceFolder": "/workspace/python-src"
}
Als Nächstes können Sie ./devcontainer/node-container/devcontainer.json für die Node.js-Entwicklung einrichten, indem Sie workspaceFolder ändern.
{
"name": "Node Container",
"dockerComposeFile": ["../../docker-compose.yml"],
"service": "node-app",
"shutdownAction": "none",
"workspaceFolder": "/workspace/node-src"
}
Die Option "shutdownAction": "none" in den devcontainer.json-Dateien ist optional, lässt die Container aber ausgeführt, wenn VS Code geschlossen wird -- dies verhindert, dass Sie versehentlich beide Container herunterfahren, indem Sie ein Fenster schließen.
Verbinden Sie sich mit mehreren Containern in mehreren VS Code-Fenstern
- Öffnen Sie ein VS Code-Fenster auf der Stammebene des Projekts.
- Führen Sie Dev Containers: Reopen in Container aus der Befehlspalette (F1) aus und wählen Sie
Python Container. - VS Code startet dann beide Container, lädt das aktuelle Fenster neu und stellt eine Verbindung zum ausgewählten Container her.
- Öffnen Sie als Nächstes ein neues Fenster über Datei > Neues Fenster.
- Öffnen Sie Ihr Projekt im aktuellen Fenster auf der Stammebene.
- Führen Sie Dev Containers: Reopen in Container aus der Befehlspalette (F1) aus und wählen Sie
Node Container. - Das aktuelle VS Code-Fenster wird neu geladen und stellt eine Verbindung zum ausgewählten Container her.
Sie können jetzt von separaten Fenstern aus mit beiden Containern interagieren.
Verbinden Sie sich mit mehreren Containern in einem einzigen VS Code-Fenster
- Öffnen Sie ein VS Code-Fenster auf der Stammebene des Projekts.
- Führen Sie Dev Containers: Reopen in Container aus der Befehlspalette (F1) aus und wählen Sie
Python Container. - VS Code startet dann beide Container, lädt das aktuelle Fenster neu und stellt eine Verbindung zum ausgewählten Container her.
- Führen Sie Dev Containers: Switch Container aus der Befehlspalette (F1) aus und wählen Sie
Node Container. - Das aktuelle VS Code-Fenster wird neu geladen und stellt eine Verbindung zum ausgewählten Container her.
- Sie können mit demselben Befehl zurückwechseln.
Erweitern einer Docker Compose-Datei beim Verbinden mit zwei Containern
Wenn Sie Ihre Docker Compose-Datei für die Entwicklung erweitern möchten, sollten Sie eine einzige docker-compose.yml verwenden, die **beide** Dienste erweitert (nach Bedarf) und auf die in **beiden** devcontainer.json-Dateien verwiesen wird.
Betrachten Sie zum Beispiel diese docker-compose.devcontainer.yml-Datei
services:
python-api:
volumes:
- ~:~/local-home-folder # Additional bind mount
# ...
node-app:
volumes:
- ~/some-folder:~/some-folder # Additional bind mount
# ...
Beide .devcontainer.json-Dateien würden wie folgt aktualisiert werden
"dockerComposeFile": [
"../../docker-compose.yml",
"../../docker-compose.devcontainer.yml",
]
Diese Liste von Compose-Dateien wird beim Starten der Container verwendet, sodass das Referenzieren unterschiedlicher Dateien in jeder devcontainer.json unerwartete Ergebnisse liefern kann.