# Python Project Template Template pre Python projekt s Dev Container workflow, kde sa devcontainer image taha z registry a nebuildi sa pri kazdom otvoreni. ## Co projekt obsahuje - devcontainer konfiguraciu (`.devcontainer/devcontainer.json`) - compose definiciu pre devcontainer (`.devcontainer/docker-compose.yml`) - centralne nastavenie premennych (`.devcontainer/.env`) - skript na build/push devcontainer image (`scripts/publish-devcontainer-image.ps1`) - VS Code tasky na build/push (`.vscode/tasks.json`) - hlavny `Dockerfile` pre aplikacny image (`Dockerfile`) ## Konfiguracia cez `.devcontainer/.env` `.devcontainer/.env` je centralne miesto pre devcontainer premenne. Pouziva ho: - `.devcontainer/docker-compose.yml` (image tag, user, volume cesty, container environment) - `scripts/publish-devcontainer-image.ps1` (tagovanie a push devcontainer image) - `Dockerfile` aplikacie (volitelne cez `--build-arg`) Aktualne premenne: - `PYTHON_BASE` - verzia Pythonu pre devcontainer image tag - `DEVCONTAINER_IMAGE_REV` - revizia devcontainer image - `DEVCONTAINER_IMAGE_PULL_REPO` - registry/repo odkial sa image taha pri otvoreni devcontainera - `DEVCONTAINER_IMAGE_PUSH_REPO` - registry/repo kam sa image publikuje - `PIP_INDEX_URL` - pip index URL v kontajneri - `PIP_ROOT_USER_ACTION` - pip spravanie pri root userovi - `WORKSPACE_DIR` - workspace cesta v kontajneri - `VENV_PATH` - cesta k virtualnemu prostrediu - `REQUIREMENTS_FILE` - cesta k requirements suboru pre `post_create.sh` - `DEVCONTAINER_RUN_USER` - Linux user, pod ktorym bezi devcontainer service - `APP_USER_ID` - UID usera `appuser` v hlavnom `Dockerfile` - `REMOTE_HOME` - home adresar pouzity pre `.codex` a `.pypirc` mounty ## Build a publish devcontainer image Predpoklady: - Docker je nainstalovany a bezi - mas pristup do push registry (`repo.masara.eu`) ### Cez VS Code task 1. Spusti task `devcontainer: build image`. 2. Alebo spusti `devcontainer: build and push image` pre build + push. ### Cez terminal ```powershell # iba build powershell -ExecutionPolicy Bypass -File scripts/publish-devcontainer-image.ps1 # build + push powershell -ExecutionPolicy Bypass -File scripts/publish-devcontainer-image.ps1 -Push ``` Poznamka: - Ak `docker push` zlyha (napr. neautorizovany pristup), skript skusi `docker login ` a push zopakuje este raz. ## Pouzitie vo VS Code 1. Nastav hodnoty v `.devcontainer/.env`. 2. Ak si menil `PYTHON_BASE` alebo image repo/rev, najprv publikuj novu devcontainer image. 3. Otvor projekt vo VS Code a pouzi `Reopen in Container`. Pri starte kontajnera: - image sa taha z `DEVCONTAINER_IMAGE_PULL_REPO` - workspace sa mountuje do `/workspace` - `postCreateCommand` (`.devcontainer/post_create.sh`) vytvori `.venv` a nainstaluje zavislosti z `REQUIREMENTS_FILE` - Python vo VS Code pouziva `${env:VENV_PATH}/bin/python` ## VS Code extensions a settings Devcontainer automaticky instaluje tieto VS Code extensions: - `ms-python.python` - `ms-python.vscode-pylance` - `ms-python.autopep8` - `ms-toolsai.jupyter` - `ms-python.black-formatter` - `ms-python.isort` - `codezombiech.gitignore` - `davidanson.vscode-markdownlint` - `ms-azuretools.vscode-docker` - `docker.docker` - `openai.chatgpt` - `continue.continue` Pouzite VS Code settings v devcontainery: - `python.formatting.provider: black` - `python.analysis.extraPaths: ["${workspaceFolder}/app"]` - `python.analysis.typeCheckingMode: "basic"` - `python.analysis.diagnosticMode: "workspace"` - `editor.formatOnSave: true` - `python.terminal.activateEnvironment: true` - `python.defaultInterpreterPath: "${env:VENV_PATH}/bin/python"` - `remote.restoreForwardedPorts: false` - `remote.autoForwardPortsSource: "output"` - `debug.javascript.autoAttachFilter: "disabled"` ## Aplikacny Dockerfile Hlavny `Dockerfile` podporuje build argumenty `PYTHON_BASE`, `PIP_INDEX_URL` a `APP_USER_ID`. Priklad buildu s hodnotami z `.devcontainer/.env`: ```bash set -a; source .devcontainer/.env; set +a docker build \ --build-arg PYTHON_BASE="$PYTHON_BASE" \ --build-arg PIP_INDEX_URL="$PIP_INDEX_URL" \ --build-arg APP_USER_ID="$APP_USER_ID" \ -t myapp:local . ```