Zum Inhalt springen

Container Commands

Die compose.yml enthält einige command-Definition, die im Folgenden detailliert erläutert werden.


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
'

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.


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:

Terminal-Fenster
docker compose -f .devcontainer/compose.yml run --rm deps-update

ermöglicht die Konfiguration der compose.yml durch exec ... "$@" das überschreiben des command.

So ist es möglich, gezielt NPM-Dependencies zu installieren, z.B.:

Terminal-Fenster
docker compose -f .devcontainer/compose.yml run --rm deps-update socket

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",
...
}
  1. Das sorgt dafür, dass genau die Versionen aus der Lockfile installiert werden – ohne Updates, ohne Neuauflösung von Abhängigkeiten.