Führen Sie zunächst > Remote-Container: Entwicklungscontainer-Konfigurationsdateien hinzufügen ...
in der Befehlspalette aus, um die DevContainer-Konfigurationsdatei zu erstellen.
Zu diesem Zeitpunkt können Sie eine Vorlage auswählen, wählen Sie also "Docker von Docker" ("Docker von Docker Compose", wenn Sie DevContainer mit Docker-Compose ausführen möchten).
Jetzt können Sie Docker im Container verwenden, indem Sie > Remote-Container: In Container erneut öffnen
ausführen.
Wenn Sie eine zusätzliche Sprache usw. installieren möchten, können Sie ".devcontainer / Dockerfile" leicht bearbeiten, um das Basis-Image zu ändern. Sie können jedes Debian- oder Ubuntu-basierte Image verwenden. Das folgende Beispiel basiert auf dem offiziellen DevContainer-Image für die Go-Sprache.
.devcontainer/Dockerfile
# Note: You can use any Debian/Ubuntu based image you want.
FROM mcr.microsoft.com/vscode/devcontainers/go:1.15
#Folgendes wird weggelassen
Seien Sie vorsichtig, wenn Sie Bind Mount in DevContainer verwenden. Wenn Sie es mounten, ohne wie unten beschrieben zu denken, finden Sie die Datei, die Sie gemountet haben sollten, nicht im Container.
$ docker run --rm -it -v $(pwd):/app golang:1.15 /bin/bash
Dies liegt daran, dass die Docker in DevContainer den Docker gemeinsam nutzen, der auf dem Host ausgeführt wird. Daher ist es beim Ausführen des Bind-Mount erforderlich, den Pfad des Hosts anstelle des Pfads in DevContainer anzugeben.
Um dieses Problem zu lösen, werden die folgenden Umgebungsvariablen standardmäßig in ".devcontainer / devcontainer.json" definiert.
json:.devcontainer/devcontainer.json
{
// ...
// Use this environment variable if you need to bind mount your local source code into a new container.
"remoteEnv": {
"LOCAL_WORKSPACE_FOLDER": "${localWorkspaceFolder}"
},
// ...
}
$ {localWorkspaceFolder}
ist eine in devcontainer.json
verfügbare Variable, die den hostseitigen Pfad des geöffneten Ordners bezeichnet.
Mit dieser Einstellung kann die Umgebungsvariable "LOCAL_WORKSPACE_FOLDER" auf den Hostpfad in DevContainer verweisen.
Mit anderen Worten, damit das vorherige Beispiel ordnungsgemäß funktioniert, gehen Sie wie folgt vor.
$ docker run --rm -it -v $LOCAL_WORKSPACE_FOLDER:/app golang:1.15 /bin/bash
In ähnlicher Weise muss für Docker-Compose bei Verwendung von Bind Mount der Pfad auf der Hostseite angegeben werden.
Die folgenden Einstellungen funktionieren in DevContainer nicht.
docker-compose.yml
version: "3"
services:
app:
image: ruby:2.7
volumes:
- .:/app
working_dir: /app
command: bundle exec rackup
Es funktioniert wie folgt.
docker-compose.yml
version: "3"
services:
app:
image: ruby:2.7
volumes:
- ${LOCAL_WORKSPACE_FOLDER}:/app
working_dir: /app
command: bundle exec rackup
Wenn Sie es jedoch wie oben beschrieben schreiben, können Sie es nicht außerhalb von DevContainer verschieben.
Das ist unpraktisch, daher scheint es gut, die Einstellungen für DevContainer wie folgt in docker-compose.override.yml
[^ 1] usw. zu schreiben.
[^ 1]: Dies ist eine optionale Konfigurationsdatei, die standardmäßig vom Docker erstellt wird. docker-compose.yml
Überschreibt die Einstellungen in. Weitere Informationen finden Sie unter hier.
yaml:docker-compose.override.yml
services:
app:
volumes:
- ${LOCAL_WORKSPACE_FOLDER}:/app
Wenn das Host-Betriebssystem Windows ist, tritt ein Fehler auf, selbst wenn Sie wie oben beschrieben $ {LOCAL_WORKSPACE_FOLDER}
festlegen.
$ docker-compose up
ERROR: Named volume "c:\Users\frozenbonito\dev\docker-from-docker:/app" is used in service "app" but no declaration was found in the volumes section.
Dies liegt daran, dass der Wert von "$ {localWorkspaceFolder}", wenn das Host-Betriebssystem Windows ist, ein Pfad im Windows-Stil ist und Docker-Compose ihn fälschlicherweise als Volume-Namen erkennt.
Es gibt zwei Lösungen.
Stellen Sie den Windows-Pfad auf Docker-Compose ein, indem Sie die lange Syntax in der Volume-Einstellung verwenden (siehe unten). Es kann richtig interpretiert werden.
yaml:docker-compose.override.yml
services:
app:
volumes:
- type: bind
source: ${LOCAL_WORKSPACE_FOLDER}
target: /app
Wenn die Umgebungsvariable COMPOSE_FORCE_WINDOWS_HOST
auf" true "oder" 1 "gesetzt ist, sieht Docker-Compose wie DevContainer aus. Der HOST-Pfad in kurzer Syntax wird jetzt als Windows-Pfad interpretiert, selbst wenn er in einer Linux-Umgebung ausgeführt wird. Werden.
Es ist eine gute Idee, es wie folgt in devcontainer.json
festzulegen.
json:.devcontainer/devcontainer.json
{
// ...
"remoteEnv": {
"LOCAL_WORKSPACE_FOLDER": "${localWorkspaceFolder}",
"COMPOSE_FORCE_WINDOWS_HOST": "true"
},
// ...
}
Recommended Posts