[DOCKER] Entwicklung in einem Container mit --privileged und / sbin / init, der in VSCode Remote Containers übergeben wurde

Einführung

Wenn Sie bei der Entwicklung mit VSCode-Remotecontainern eine Docker-Datei schreiben und "In Container erneut öffnen" sagen, wird der Docker-Container gestartet, aber zu diesem Zeitpunkt führt VSCode "Docker-Ausführung" aus. Wenn Sie es starten, ohne sich um irgendetwas zu kümmern und auf Offizielles Verfahren usw. zu verweisen, können Sie die Option "--privileged" nicht hinzufügen. , Systemctl kann nicht auf dem Container ausgeführt werden, da / sbin / init nicht an ENTRYPOINT übergeben werden kann.

Wie im Titel erwähnt, wird in diesem Artikel der Forschungsprozess zum Übergeben von "--privileged" und "/ sbin / init" an "Docker run" in dem von VSCode Remote Containers verwendeten Container und die Methode zu dessen Realisierung vorgestellt.

0. Vorwort: Umfrage

Als ich untersuchte, ob dies auf einfache Weise möglich ist, stellte ich zunächst fest, dass devcontainer.json in der Konfigurationsdatei einen Parameter namens "runArgs" enthält, und hier kann ich einen Parameter für "Docker Run" hinzufügen. Referenz: devcontainer.json Referenz Mit dieser Methode konnte ich jedoch "--privileged" hinzufügen, aber "--entrypoint" nicht überschreiben. Wenn Sie den Docker-Container mit "Reopen in Container" mit VSCode Remote Containers starten, lautet das Argument von "Docker Run" ** --entrypoint / bin / sh -c Echo Container gestartet; Trap "exit 0" "15; while sleep 1 & wait $ !; Do :; done` ** wurde hinzugefügt, und es scheint, dass die in devcontainer.json geschriebenen Parameter dies nicht überschreiben können.

Sie können sehen, welche Art von Befehl beim Start aus dem Protokoll fließt, das angezeigt wird, indem Sie auf den Link im Popup unten klicken, der beim Start angezeigt wird. image.png

Wie im folgenden Link erläutert, hat der im Argument angegebene "--entrypoint" Vorrang vor dem in der Docker-Datei geschriebenen ENTRYPOINT und CMD. Selbst wenn Sie ihn in die Docker-Datei schreiben, kann er nicht überschrieben werden. Dies ist die höchste Priorität, da VSCode immer "--entrypoint" an "Docker Run" als Argument anfügt. Referenz: Mit Dockerfile erstellen

1. Realisierungsverfahren

Aus diesem Grund habe ich mich entschlossen, die folgenden Schritte auszuführen.

(1) Führen Sie zuerst "In Container erneut öffnen" gemäß dem Verfahren aus.

Diese Prozedur erstellt das Docker-Image und startet den Container. Öffnen Sie zu diesem Zeitpunkt das Protokoll über den Link im obigen Popup, suchen Sie den folgenden Befehl im Protokoll und kopieren Sie ihn.

docker run -a STDOUT -a STDERR --mount type=bind,source=<Pfad Ihrer Umgebung>,target=<Pfad Ihrer Umgebung>,consistency=cached -l vsch.quality=stable -l vsch.remote.devPort=0 -l vsch.local.folder=<Pfad Ihrer Umgebung> --entrypoint /bin/sh <Ihr eigenes Docker-Image> -c echo Container started ; trap "exit 0" 15; while sleep 1 & wait $!; do :; done

(2) Mit VSCode vom Container trennen

Der in (1) gestartete Container ist nicht "--privilegiert". Verwenden Sie daher VSCode, um die Verbindung vorübergehend zu trennen.

(3) Ändern Sie den kopierten Befehl teilweise

Fügen Sie dem kopierten Befehl "--privileged" hinzu und schreiben Sie "--entrypoint" neu.

docker run -a STDOUT -a STDERR --mount type=bind,source=<Pfad Ihrer Umgebung>,target=<Pfad Ihrer Umgebung>,consistency=cached -l vsch.quality=stable -l vsch.remote.devPort=0 -l vsch.local.folder=<Pfad Ihrer Umgebung> --privileged --entrypoint /sbin/init <Ihr eigenes Docker-Image>

(4) Führen Sie den obigen Befehl im lokalen Terminal aus

Bei der Ausführung wird der Docker-Container gemäß der Option (3) gestartet. Sie können den Startstatus mit "Docker ps" überprüfen.

(5) Führen Sie "An laufenden Container anhängen" mit VS-Code aus

Fügen Sie als Nächstes den in (4) gestarteten Container an VSCode an. Wählen Sie zunächst "An laufenden Container anhängen" (siehe Abbildung unten).

image.png

Wählen Sie als Nächstes auf dem Bildschirm zur Auswahl eines laufenden Containers einfach den Container aus. image.png

Zu diesem Zeitpunkt können Sie über VSCode eine Verbindung zum Container herstellen und die Entwicklungsumgebung öffnen.

2. Funktionsprüfung

Öffnen Sie das Terminal des Containers mit VSCode und geben Sie "systemctl" ein.

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
(Da es lange unten ist, wird es weggelassen)

Auf diese Weise wird der Fehler behoben und Sie können ihn treffen.

Schließlich

Wenn Sie die Schritte ausführen, um auf diese Weise eine Verbindung zum gestarteten Container von VSCode herzustellen, können Sie systemctl auch auf VSCode Remote Containers ausführen. Diesmal ist es ein wenig nervig, aber ich entschied, dass es schneller sein würde, mit VSCode auf "Docker Build" aufzusteigen und den Befehl "Docker Run" mit verschiedenen Optionen aus dem VSCode-Protokoll zu finden. (Es mag einen besseren Weg geben, aber wenn er gefunden wird, werde ich ihn hinzufügen)

Wie der Name schon sagt, bedeutet "--privilegiert" Privileg, daher sollten Sie es systematisch verwenden.

Verweise

Recommended Posts

Entwicklung in einem Container mit --privileged und / sbin / init, der in VSCode Remote Containers übergeben wurde
So entwickeln und registrieren Sie eine Sota-App in Java
So starten Sie einen Docker-Container mit einem in einer Batchdatei bereitgestellten Volume
[So fügen Sie ein Video mit Rails in haml ein]
So konvertieren Sie A in a und a in A mit logischem Produkt und Summe in Java
[Docker] Wie man mit einem Container in Heroku aktualisiert und wie man mit Migrate Error umgeht
So stellen Sie VSCode Remote Containers in einem Docker-Compose-Projekt bereit, das sowohl die API als auch die Front-App enthält
Zuordnung zu einer Klasse mit einem Wertobjekt in How to My Batis
So richten Sie einen Proxy mit Authentifizierung in Feign ein
So erstellen Sie eine JAR-Datei ohne Abhängigkeiten in Maven
So benennen Sie ein Modell mit externen Schlüsseleinschränkungen in Rails um
So erstellen Sie einen Java-Container
So testen Sie eine private Methode und verspotten sie teilweise in Java
[Persönliches Memo] Interaktion mit dem Zufallszahlengenerator in Java
Beginnen Sie mit der Installation von Docker auf EC2 und dem Ausführen von Yellowfin in einem Container
Server mit Spring Gradle ausführbar So erstellen Sie JAR und WAR
So erstellen Sie eine App mit einem Plug-In-Mechanismus [C # und Java]
So kompilieren Sie Java mit VsCode & Ant
So fügen Sie ein Video in Rails ein
Verwendung von Docker in VSCode DevContainer
So veröffentlichen Sie eine Bibliothek in jCenter
So erhalten Sie die ID eines Benutzers, der sich in Swift bei Firebase authentifiziert hat
So senden Sie benutzerdefinierte Metriken und Ereignisse mit Laravel in einer Docker-Compose-Umgebung an Datadog
So komprimieren Sie eine JAVA-CSV-Datei und verwalten sie in einem Byte-Array
So speichern Sie gleichzeitig Daten in einem Modell, das einem verschachtelten Formular zugeordnet ist (Rails 6.0.0)
So geben Sie ein Tag an, das einen Doppelpunkt (:) und einen Namespace in der CSS-Auswahl von Nokogiri enthält
So erstellen Sie einen Jenkins-Server mit einem Docker-Container unter CentOS 7 von VirtualBox und greifen von einem lokalen PC auf den Jenkins-Server zu
So erhalten Sie einen Heapdump aus einem Docker-Container
So zeigen Sie eine Webseite in Java an
Einstellung zum Verlassen des Docker-Containers mit VScode
So führen Sie eine djUnit-Aufgabe in Ant aus
So fügen Sie in Spring Boot einen Klassenpfad hinzu
So aktualisieren Sie eine vorgefertigte Datei in einem Docker-Container
So erstellen Sie ein Thema in Liferay 7 / DXP
So implementieren Sie eine ähnliche Funktion in Rails
So erstellen Sie einfach ein Pulldown mit Rails
So erstellen Sie eine API mit GraphQL und Rails
So generieren Sie automatisch einen Konstruktor in Eclipse
[Rails] [Docker] Kopieren und Einfügen ist in Ordnung! So erstellen Sie eine Rails-Entwicklungsumgebung mit Docker
[Arbeitsnotiz für persönliche Anwendungen] Anzeigen von Balkendiagrammen und Liniendiagrammen in einem Diagramm
Erstellen Sie in CentOS8.2 einen privaten / öffentlichen Schlüssel und stellen Sie mit VS Code eine Verbindung zu SSH her
Speichern von Dateien mit der angegebenen Erweiterung unter dem in Java angegebenen Verzeichnis in der Liste
[Docker] So sehen Sie den Inhalt von Volumes. Starten Sie einen Container mit Root-Rechten.
So beenden Sie Docker für Mac und erstellen eine Docker-Entwicklungsumgebung mit Ubuntu + Vagrant
Umgang mit Fehlern in Rails s konnte keine JavaScript-Laufzeit finden.
So implementieren Sie ein kreisförmiges Profilbild mit CarrierWave und R Magick in Rails