[DOCKER] Comment développer dans un conteneur avec --privileged et / sbin / init passés dans VSCode Remote Containers

introduction

Lors du développement avec VSCode Remote Containers, si vous écrivez un Dockerfile et dites "Rouvrir dans le conteneur", le conteneur Docker démarrera, mais à ce moment, VSCode exécutera docker run. Par conséquent, si vous le démarrez sans vous soucier de quoi que ce soit et en vous référant à la Procédure officielle etc., vous ne pouvez pas ajouter l'option --privileged. , Systemctl ne peut pas être exécuté sur le conteneur car / sbin / init ne peut pas être passé à ENTRYPOINT.

Comme mentionné dans le titre, cet article présentera le processus de recherche pour passer --privileged et / sbin / init à docker run dans le conteneur utilisé par VSCode Remote Containers, et la méthode pour le réaliser.

0. Préface: Enquête

Tout d'abord, lorsque j'ai vérifié si cela pouvait être fait de manière simple, j'ai trouvé que devcontainer.json dans le fichier de configuration avait un paramètre appelé "runArgs", et ici je peux ajouter un paramètre pour docker run. Référence: référence devcontainer.json Cependant, cette méthode m'a permis d'ajouter --privileged mais pas de remplacer --entrypoint. Lorsque vous démarrez le conteneur Docker avec "Reopen in Container" avec VSCode Remote Containers, l'argument de docker run est ** --entrypoint / bin / sh <your own Docker Image> -c echo Container started; trap "exit 0" "15; while sleep 1 & wait $!; Do:; done ** a été ajouté, et il semble que les paramètres écrits dans devcontainer.json ne peuvent pas écraser cela.

Vous pouvez voir quel type de commande circule au démarrage à partir du journal qui peut être vu en appuyant sur le lien dans la fenêtre contextuelle ci-dessous qui s'affiche au démarrage. image.png

De plus, comme expliqué dans le lien suivant, le --entrypoint spécifié dans l'argument a la priorité sur le ENTRYPOINT et le CMD écrits dans le Dockerfile, donc même si vous l'écrivez dans le Dockerfile, il ne peut pas être écrasé. Il s'agit de la priorité la plus élevée car VSCode ajoute toujours «--entrypoint» à «docker run» comme argument. Référence: Build with Dockerfile

1. Procédure de réalisation

Par conséquent, j'ai décidé de suivre les étapes ci-dessous.

(1) Tout d'abord, exécutez "Reopen in Container" selon la procédure.

Cette procédure crée l'image Docker et lance le conteneur. À ce stade, ouvrez le journal à partir du lien dans la fenêtre contextuelle ci-dessus, recherchez la commande suivante dans le journal et copiez-le.

docker run -a STDOUT -a STDERR --mount type=bind,source=<Chemin de votre environnement>,target=<Chemin de votre environnement>,consistency=cached -l vsch.quality=stable -l vsch.remote.devPort=0 -l vsch.local.folder=<Chemin de votre environnement> --entrypoint /bin/sh <Votre propre image Docker> -c echo Container started ; trap "exit 0" 15; while sleep 1 & wait $!; do :; done

(2) Déconnectez-vous du conteneur avec VSCode

Le conteneur démarré dans (1) n'est pas --privileged, utilisez donc VSCode pour le déconnecter une fois.

(3) Modifier partiellement la commande copiée

Ajoutez --privileged à la commande copiée et réécrivez --entrypoint.

docker run -a STDOUT -a STDERR --mount type=bind,source=<Chemin de votre environnement>,target=<Chemin de votre environnement>,consistency=cached -l vsch.quality=stable -l vsch.remote.devPort=0 -l vsch.local.folder=<Chemin de votre environnement> --privileged --entrypoint /sbin/init <Votre propre image Docker>

(4) Exécutez la commande ci-dessus dans le terminal local

Une fois exécuté, le conteneur docker sera démarré selon l'option (3). Vous pouvez vérifier l'état de démarrage avec docker ps.

(5) Exécutez "Attach to Running Container" avec VS Code

Ensuite, attachez le conteneur démarré dans (4) à VSCode. Tout d'abord, sélectionnez «Joindre au conteneur en cours d'exécution» comme indiqué dans l'image ci-dessous.

image.png

Ensuite, sur l'écran de sélection d'un conteneur en cours d'exécution, sélectionnez simplement le conteneur. image.png

À ce stade, vous pouvez vous connecter au conteneur à partir de VSCode et ouvrir l'environnement de développement.

2. Contrôle de fonctionnement

Ouvrez le terminal du conteneur avec VSCode et tapez systemctl.

bash-4.2# systemctl
  UNIT                          LOAD   ACTIVE     SUB       DESCRIPTION
  dev-vda1.device               loaded activating tentative /dev/vda1
  -.mount                       loaded active     mounted   /
  dev-hugepages.mount           loaded active     mounted   Huge Pages File System
  dev-mqueue.mount              loaded active     mounted   POSIX Message Queue File Syste
  etc-hostname.mount            loaded active     mounted   /etc/hostname
  etc-hosts.mount               loaded active     mounted   /etc/hosts
(Puisqu'il est long en dessous, il est omis)

De cette façon, l'erreur est résolue et vous pouvez la frapper.

finalement

En suivant les étapes pour vous connecter au conteneur démarré à partir de VSCode de cette manière, vous pouvez également exécuter systemctl sur VSCode Remote Containers. Cette fois, c'est un peu ennuyeux, mais j'ai décidé qu'il serait plus rapide d'exécuter docker build avec VSCode et de trouver la commande docker run avec diverses options du journal VSCode. (Il y a peut-être un meilleur moyen, mais s'il est trouvé, je l'ajouterai)

Comme son nom l'indique, «--privileged» signifie privilège, vous devez donc l'utiliser systématiquement.

Références

Recommended Posts

Comment développer dans un conteneur avec --privileged et / sbin / init passés dans VSCode Remote Containers
Comment développer et enregistrer une application Sota en Java
Comment démarrer un conteneur Docker avec un volume monté dans un fichier de commandes
[Comment insérer une vidéo dans un hameau avec Rails]
Comment convertir A en A et A en A en utilisant le produit logique et la somme en Java
[Docker] Comment mettre à jour à l'aide d'un conteneur dans Heroku et comment gérer l'erreur de migration
Comment déployer des conteneurs distants VSCode dans un projet docker-compose qui comprend à la fois l'API et l'application frontale
Mappage à une classe avec un objet de valeur dans How to My Batis
Comment configurer un proxy avec authentification dans Feign
Comment créer un fichier jar sans dépendances dans Maven
Comment renommer un modèle avec des contraintes de clé externes dans Rails
Comment créer un conteneur Java
Comment tester une méthode privée et la simuler partiellement en Java
[Mémo personnel] Comment interagir avec le générateur de nombres aléatoires en Java
Commencer par installer Docker sur EC2 et exécuter Yellowfin dans un conteneur
Exécutable serveur avec Spring gradle Comment créer JAR et WAR
Comment créer une application avec un mécanisme de plug-in [C # et Java]
Comment compiler Java avec VsCode & Ant
Comment insérer une vidéo dans Rails
Comment utiliser Docker dans VSCode DevContainer
Comment publier une bibliothèque dans jCenter
Comment obtenir l'ID d'un utilisateur qui s'est authentifié avec Firebase dans Swift
Comment envoyer des métriques et des événements personnalisés à datadog avec laravel dans l'environnement docker-compose
Comment compresser un fichier JAVA CSV et le gérer dans un tableau d'octets
Comment stocker simultanément des données dans un modèle associé à une forme imbriquée (Rails 6.0.0)
Comment spécifier une balise contenant un deux-points (:) et un espace de noms dans le sélecteur CSS de Nokogiri
Comment créer un serveur Jenkins avec un conteneur Docker sur CentOS 7 de VirtualBox et accéder au serveur Jenkins à partir d'un PC local
Comment obtenir un heapdump à partir d'un conteneur Docker
Comment afficher une page Web en Java
Paramètre pour quitter le conteneur Docker avec VScode
Comment exécuter une tâche djUnit dans Ant
Comment ajouter un chemin de classe dans Spring Boot
Comment mettre à jour un fichier prédéfini dans un conteneur Docker
Comment créer un thème dans Liferay 7 / DXP
Comment implémenter une fonctionnalité similaire dans Rails
Comment créer facilement un pull-down avec des rails
Comment créer une API avec GraphQL et Rails
Comment générer automatiquement un constructeur dans Eclipse
[Rails] [Docker] Le copier-coller est OK! Comment créer un environnement de développement Rails avec Docker
[Mémo de travail de l'application personnelle] Comment afficher un graphique à barres et un graphique linéaire dans un graphique
Créez une clé privée / clé publique dans CentOS8.2 et connectez-vous à SSH avec VS Code
Comment enregistrer des fichiers avec l'extension spécifiée sous le répertoire spécifié en Java dans la liste
[Docker] Comment voir le contenu des volumes. Démarrez un conteneur avec les privilèges root.
Comment quitter Docker pour Mac et créer un environnement de développement Docker avec Ubuntu + Vagrant
Comment gérer les erreurs dans Rails? Impossible de trouver un runtime JavaScript.
Comment implémenter une image de profil circulaire avec CarrierWave et R Magick in Rails