Container Commands
Die compose.yml enthält einige command-Definition, die im Folgenden detailliert erläutert werden.
init-volumes-Container
Abschnitt betitelt „init-volumes-Container“Der command für den init-volumes-Container sorgt dafür, dass die benötigten Verzeichnisse innerhalb der Docker Volumes angelegt werden, sofern sie noch nicht vorhanden sind.
Anschließend werden die Besitzrechte auf den node-User gesetzt.
Dabei müssen alle verwendeten Named Volumes hier aufgeführt werden, damit sie entsprechend vorbereitet werden.
compose.yml
command: | bash -lc ' set -e
uid=$$(id -u node) gid=$$(id -g node)
for dir in \ /workspaces/security-oriented-dev-container-project/node_modules \ /home/node/.claude do echo "dir=$$dir uid=$$uid gid=$$gid" mkdir -p "$$dir" chown "$$uid:$$gid" "$$dir" done 'deps-Container
Abschnitt betitelt „deps-Container“Der Unterschied zum deps-update-Container besteht darin, dass die Installation im deps-Container deterministisch über npm ci (anstelle von npm i) bzw. mit --frozen-lockfile erfolgt1.
compose.yml
command: > bash -lc ' GITHUB_AUTH_TOKEN="$(cat /run/secrets/github_auth_token)" exec npm ci --ignore-scripts 'Dazu kommt, dass der Container nur lesenden Zugriff auf den Workspace im Host-System erhält. Die NPM-Dependencies werden in das gemountete node_modules-Verzeichnis außerhalb des Host-System installiert.
Somit kann dieser Container nichts am Host-System verändern.
deps-update-Container
Abschnitt betitelt „deps-update-Container“Anders als der deps-Container ist der deps-update-Container dafür gedacht, neue Dependencies oder neue Versionen von Dependencies zu installieren. Die Installation der NPM-Dependencies erfolgt entsprechend über npm i (anstelle von npm ci bzw. ohne --frozen-lockfile).
compose.yml
entrypoint: > bash -lc ' GITHUB_AUTH_TOKEN="$(cat /run/secrets/github_auth_token)" exec npm i --ignore-scripts "$@" ' --command: []Dabei werden sowohl das Lockfile, als auch ggf. die package.json verändert, wofür der Container schreibrechte auf das gemountete Verzeichnis auf dem Host-System erhält.
Somit kann dieser Container das Projektverzeichnis im Host-System verändern.
Neben der Ausführung des Containers:
docker compose -f .devcontainer/compose.yml run --rm deps-updateermöglicht die Konfiguration der compose.yml durch exec ... "$@" das überschreiben des command.
So ist es möglich, gezielt NPM-Dependencies zu installieren, z.B.:
docker compose -f .devcontainer/compose.yml run --rm deps-update socketapp-Container
Abschnitt betitelt „app-Container“Der app-Container startet die Applikation im Container. In der compose.yml des Referenzprojekts erfolgt dies über folgenden command:
compose.yml
command: ["npm", "run", "devcontainer"]Die package.json des Referenzprojekts enthält entsprechend ein scripts-Eintrag um den Server zu starten und das Secret reinzureichen.
package.json
"scripts": { ... "devcontainer": "dotenv -e /run/secrets/app_env -- tsx src/server.ts", ...}Footnotes
Abschnitt betitelt „Footnotes“-
Das sorgt dafür, dass genau die Versionen aus der Lockfile installiert werden – ohne Updates, ohne Neuauflösung von Abhängigkeiten. ↩