Comment utiliser Docker dans VSCode DevContainer

Créer un DevContainer

Tout d'abord, exécutez > Remote-Containers: Add Development Container Configuration Files ... dans la palette de commandes pour créer le fichier de configuration DevContainer. À ce stade, vous pouvez sélectionner un modèle, alors sélectionnez Docker from Docker ( Docker from Docker Compose si vous souhaitez exécuter DevContainer avec docker-compose).

Vous pouvez maintenant utiliser Docker dans le conteneur en exécutant > Remote-Containers: Reopen in Container.

Si vous souhaitez installer une langue supplémentaire, etc., il est facile d'éditer .devcontainer / Dockerfile pour changer l'image de base. Vous pouvez utiliser n'importe quelle image basée sur Debian ou Ubuntu. Voici un exemple basé sur l'image officielle DevContainer pour le langage Go.

.devcontainer/Dockerfile


# Note: You can use any Debian/Ubuntu based image you want. 
FROM mcr.microsoft.com/vscode/devcontainers/go:1.15

#Ce qui suit est omis

Utiliser le montage de liaison de Docker dans DevContainer

Soyez prudent lorsque vous utilisez le montage bind dans DevContainer. Si vous le montez sans penser comme ci-dessous, vous ne trouverez pas le fichier que vous auriez dû monter dans le conteneur.

$ docker run --rm -it -v $(pwd):/app golang:1.15 /bin/bash

En effet, les Dockers de DevContainer partagent le Docker exécuté sur l'hôte. Par conséquent, lors du montage de la liaison, il est nécessaire de spécifier le chemin de l'hôte au lieu du chemin dans DevContainer.

Pour résoudre ce problème, les variables d'environnement suivantes sont définies par défaut dans .devcontainer / devcontainer.json.

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} est une variable disponible dans devcontainer.json qui signifie le chemin côté hôte du dossier ouvert. Ce paramètre permet à la variable d'environnement LOCAL_WORKSPACE_FOLDER de référencer le chemin de l'hôte dans DevContainer.

En d'autres termes, pour que l'exemple précédent fonctionne correctement, procédez comme suit.

$ docker run --rm -it -v $LOCAL_WORKSPACE_FOLDER:/app golang:1.15 /bin/bash

Utiliser le montage de liaison docker-compose dans DevContainer

De même pour docker-compose, lors de l'utilisation de bind mount, il est nécessaire de spécifier le chemin du côté hôte.

Les paramètres suivants ne fonctionnent pas dans DevContainer.

docker-compose.yml


version: "3"

services:
  app:
    image: ruby:2.7
    volumes:
      - .:/app
    working_dir: /app
    command: bundle exec rackup

Cela fonctionne en écrivant comme suit.

docker-compose.yml


version: "3"

services:
  app:
    image: ruby:2.7
    volumes:
      - ${LOCAL_WORKSPACE_FOLDER}:/app
    working_dir: /app
    command: bundle exec rackup

Cependant, si vous l'écrivez comme ci-dessus, vous ne pouvez pas le déplacer hors de DevContainer. Ce n'est pas pratique, il semble donc bon d'écrire les paramètres de DevContainer dans docker-compose.override.yml [^ 1] etc. comme suit.

[^ 1]: il s'agit d'un fichier de configuration facultatif que docker-compose charge par défaut. docker-compose.yml Remplace les paramètres dans. Pour plus d'informations, voir ici.

yaml:docker-compose.override.yml


services:
  app:
    volumes:
      - ${LOCAL_WORKSPACE_FOLDER}:/app

Lorsque le système d'exploitation hôte est Windows

Si le système d'exploitation hôte est Windows, une erreur se produira même si vous définissez en utilisant $ {LOCAL_WORKSPACE_FOLDER} comme décrit ci-dessus.

$ 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.

C'est parce que si le système d'exploitation hôte est Windows, la valeur de $ {localWorkspaceFolder} sera un chemin de style Windows et docker-compose le reconnaîtra par erreur comme le nom du volume.

Il existe deux solutions.

Utilisez la longue syntaxe des volumes

Définissez le chemin Windows sur docker-compose en utilisant la syntaxe longue dans le paramètre des volumes comme indiqué ci-dessous. Il peut être interprété correctement.

yaml:docker-compose.override.yml


services:
  app:
    volumes:
      - type: bind
        source: ${LOCAL_WORKSPACE_FOLDER}
        target: /app

Définissez la variable d'environnement COMPOSE_FORCE_WINDOWS_HOST

Si la variable d'environnement COMPOSE_FORCE_WINDOWS_HOST est définie sur true ou 1, docker-compose ressemble à DevContainer. Le chemin HOST dans syntaxe courte est maintenant interprété comme un chemin Windows même s'il s'exécute dans un environnement Linux Devenir.

C'est une bonne idée de le définir dans devcontainer.json comme suit.

json:.devcontainer/devcontainer.json


{
	// ...

	"remoteEnv": {
		"LOCAL_WORKSPACE_FOLDER": "${localWorkspaceFolder}",
		"COMPOSE_FORCE_WINDOWS_HOST": "true"
	},

	// ...
}

Recommended Posts

Comment utiliser Docker dans VSCode DevContainer
Comprendre en 5 minutes !! Comment utiliser Docker
Comment utiliser Lombok au printemps
Comment utiliser InjectorHolder dans OpenAM
Comment utiliser les classes en Java?
Prise en charge multilingue de Java Comment utiliser les paramètres régionaux
Comment utiliser le volume nommé dans docker-compose.yml
Comment utiliser MySQL dans le didacticiel Rails
Comment utiliser les variables d'environnement dans RubyOnRails
Comment utiliser credentials.yml.enc introduit à partir de Rails 5.2
Comment utiliser ExpandableListView dans Android Studio
Comment utiliser Map
Comment utiliser rbenv
Comment utiliser with_option
Comment utiliser fields_for
Comment utiliser java.util.logging
Comment utiliser la carte
Comment utiliser collection_select
Comment utiliser Twitter4J
Comment utiliser active_hash! !!
Comment installer Docker
Comment utiliser MapStruct
Comment utiliser TreeSet
[Comment utiliser l'étiquette]
Comment utiliser l'identité
Comment utiliser le hachage
Comment utiliser Dozer.mapper
Comment utiliser Gradle
Comment utiliser org.immutables
Comment utiliser java.util.stream.Collector
Comment utiliser VisualVM
Comment utiliser Map
Comment vérifier le journal dans le conteneur Docker
[Rails] Comment utiliser les boîtes de sélection dans Ransack
Comment mettre à jour un fichier prédéfini dans un conteneur Docker
Comment utiliser JQuery dans Rails 6 js.erb
[Rails] Comment utiliser PostgreSQL dans l'environnement Vagrant
[Ruby] Comment utiliser la sortie standard dans le branchement conditionnel
Comment utiliser l'API Chain
[Java] Comment utiliser Map
Comment utiliser Queue avec priorité
[Rails] Comment utiliser enum
Comment utiliser java Facultatif
Comment utiliser le retour Ruby
Comment utiliser la bibliothèque Z3 dans Scala avec Eclipse
[Rails] Comment utiliser enum
Comment utiliser @Builder (Lombok)
Comment utiliser la classe Java
Comprendre comment utiliser le décodeur JSON de Swift en 3 minutes