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