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.
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
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.
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
Aus diesem Grund habe ich mich entschlossen, die folgenden Schritte auszuführen.
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
Der in (1) gestartete Container ist nicht "--privilegiert". Verwenden Sie daher VSCode, um die Verbindung vorübergehend zu trennen.
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>
Bei der Ausführung wird der Docker-Container gemäß der Option (3) gestartet. Sie können den Startstatus mit "Docker ps" überprüfen.
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).
Wählen Sie als Nächstes auf dem Bildschirm zur Auswahl eines laufenden Containers einfach den Container aus.
Zu diesem Zeitpunkt können Sie über VSCode eine Verbindung zum Container herstellen und die Entwicklungsumgebung öffnen.
Ö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.
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.
Recommended Posts