Verwendung von Docker in VSCode DevContainer

Erstellen eines DevContainers

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

Verwenden Sie Dockers Bind Mount in DevContainer

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

Verwenden Sie Docker-Compose Bind Mount in DevContainer

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

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.

Verwenden Sie die lange Syntax von Volumes

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

Setzen Sie die Umgebungsvariable "COMPOSE_FORCE_WINDOWS_HOST"

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

Verwendung von Docker in VSCode DevContainer
Verstehe in 5 Minuten !! Wie man Docker benutzt
Wie man Lombok im Frühling benutzt
Verwendung von InjectorHolder in OpenAM
Wie verwende ich Klassen in Java?
Mehrsprachige Unterstützung für Java Verwendung des Gebietsschemas
Verwendung des benannten Volumes in docker-compose.yml
Verwendung von MySQL im Rails-Tutorial
Verwendung von Umgebungsvariablen in RubyOnRails
Verwendung von credentials.yml.enc aus Rails 5.2
Verwendung von ExpandableListView in Android Studio
Verwendung von Map
Wie benutzt man rbenv?
Verwendung mit_option
Verwendung von fields_for
Verwendung von java.util.logging
Verwendung der Karte
Verwendung von collection_select
Wie benutzt man Twitter4J
Wie benutzt man active_hash! !!
So installieren Sie Docker
Verwendung von MapStruct
Verwendung von TreeSet
[Verwendung des Etiketts]
Wie man Identität benutzt
Wie man Hash benutzt
Verwendung von Dozer.mapper
Wie benutzt man Gradle?
Verwendung von org.immutables
Verwendung von java.util.stream.Collector
Verwendung von VisualVM
Verwendung von Map
So überprüfen Sie das Protokoll im Docker-Container
[Rails] Verwendung von Auswahlfeldern in Ransack
So aktualisieren Sie eine vorgefertigte Datei in einem Docker-Container
Verwendung von JQuery in Rails 6 js.erb
[Rails] Verwendung von PostgreSQL in einer Vagrant-Umgebung
[Ruby] Verwendung der Standardausgabe bei der bedingten Verzweigung
Verwendung der Ketten-API
[Java] Verwendung von Map
Verwendung der Warteschlange mit Priorität
[Rails] Verwendung von Enum
Verwendung von Java Optional
Verwendung von Ruby return
Verwendung der Z3-Bibliothek in Scala mit Eclipse
[Rails] Verwendung von Enum
Verwendung von @Builder (Lombok)
Verwendung der Java-Klasse
Verstehen Sie, wie Sie den JSON-Decoder von Swift in 3 Minuten verwenden