👷 Add dockerize command

This commit is contained in:
Brian Wiborg 2025-10-02 05:47:48 +02:00
parent e9d0fb5b80
commit e2f968bac4
No known key found for this signature in database
6 changed files with 68 additions and 2 deletions

View file

@ -1 +1 @@
__VERSION__ = "0.2.6" __VERSION__ = "0.2.7"

View file

@ -27,6 +27,12 @@ def startapp(app_name: str, root: str = "."):
scaffolding.startapp(app_name, root) scaffolding.startapp(app_name, root)
@app.command()
def dockerize(root: str = "."):
"""Create template Dockerfile and docker-compose.yml."""
scaffolding.copy_static("docker", root)
@app.command() @app.command()
def serve(root: str = ".", host="127.0.0.1", port=8000): def serve(root: str = ".", host="127.0.0.1", port=8000):
""" """
@ -41,6 +47,7 @@ def serve(root: str = ".", host="127.0.0.1", port=8000):
@app.command() @app.command()
def shell(root: str = "."): def shell(root: str = "."):
"""An interactive shell with your loaded project runtime."""
project_path = Path(root).resolve() project_path = Path(root).resolve()
project = runtime.Project(project_path) project = runtime.Project(project_path)

View file

@ -2,6 +2,8 @@ from pathlib import Path
from jinja2 import Environment, FileSystemLoader from jinja2 import Environment, FileSystemLoader
import shutil
# Base templates directory # Base templates directory
TEMPLATE_DIR = Path(__file__).parent / "templates" TEMPLATE_DIR = Path(__file__).parent / "templates"
env = Environment(loader=FileSystemLoader(str(TEMPLATE_DIR))) env = Environment(loader=FileSystemLoader(str(TEMPLATE_DIR)))
@ -53,6 +55,26 @@ def render_template_dir(
render_template_file(template_dir / template_rel_path, context, output_path) render_template_file(template_dir / template_rel_path, context, output_path)
def copy_static(dir_name: str, target_dir: Path):
"""Statically copy all files from {TEMPLATE_DIR}/{dir_name} to target_dir."""
template_dir = TEMPLATE_DIR / dir_name
target_dir = Path(target_dir)
if not template_dir.exists():
print(f"no templates found under: {dir_name}")
return
for root, _, files in template_dir.walk():
root_path = Path(root)
for file in files:
src = root_path / file
dst = target_dir / file
if dst.exists():
print(f"⛔ File exists, skipping: {dst}")
continue
shutil.copy(src, ".")
print(f"✅ Templates created successfully.")
print(f"🔧 Next, run `docker compose up -d --build`")
def startproject(name: str): def startproject(name: str):
"""Create a new project: flat structure, all project templates go into <name>/""" """Create a new project: flat structure, all project templates go into <name>/"""
target_dir = Path(name).resolve() target_dir = Path(name).resolve()

View file

@ -0,0 +1,30 @@
FROM python:3.13-alpine
ENV PYTHONDONTWRITEBYTECODE=1 \
PYTHONUNBUFFERED=1 \
POETRY_HOME="/opt/poetry" \
POETRY_VIRTUALENVS_IN_PROJECT=true \
POETRY_NO_INTERACTION=1
RUN apk add --no-cache \
build-base \
curl \
git \
bash \
libffi-dev \
openssl-dev \
python3-dev \
musl-dev
RUN curl -sSL https://install.python-poetry.org | python3 -
ENV PATH="$POETRY_HOME/bin:$PATH"
WORKDIR /app
COPY pyproject.toml poetry.lock* /app/
RUN poetry lock
RUN poetry install
COPY . /app
EXPOSE 8000
CMD ["poetry", "run", "ohmyapi", "serve", "--host", "0.0.0.0"]

View file

@ -0,0 +1,7 @@
services:
app:
build:
context: .
restart: unless-stopped
ports:
- 8000:8000

View file

@ -10,7 +10,7 @@ readme = "README.md"
license = { text = "MIT" } license = { text = "MIT" }
dependencies = [ dependencies = [
"ohmyapi (>=0.1.0,<0.2.0)" "ohmyapi"
] ]
[tool.poetry.group.dev.dependencies] [tool.poetry.group.dev.dependencies]