Update Dockerfile
This commit is contained in:
6
.dockerignore
Normal file
6
.dockerignore
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
.venv
|
||||||
|
__pycache__
|
||||||
|
*.pyc
|
||||||
|
.git
|
||||||
|
.env
|
||||||
|
src.bak
|
||||||
@@ -1,2 +0,0 @@
|
|||||||
Use `uv` for project management
|
|
||||||
Run `uv run ruff check` for linting, `uv run ty check` for type-checking
|
|
||||||
47
Dockerfile
47
Dockerfile
@@ -1,15 +1,36 @@
|
|||||||
# Java 21.0.6
|
# --- Build stage ---
|
||||||
# 'jammy' refers to Ubuntu 22.04 LTS, which is a stable and widely used base.
|
FROM python:3.12-slim-bookworm AS builder
|
||||||
|
|
||||||
# FROM maven:3.9.6-eclipse-temurin-21 AS builder
|
COPY --from=ghcr.io/astral-sh/uv:0.7.12 /uv /uvx /bin/
|
||||||
# FROM quay.ocp.banorte.com/base/openjdk-21:maven_3.8 AS builder
|
|
||||||
# WORKDIR /app
|
ENV UV_COMPILE_BYTECODE=1 \
|
||||||
# COPY pom.xml .
|
UV_LINK_MODE=copy \
|
||||||
# COPY src ./src
|
UV_NO_DEV=1 \
|
||||||
# RUN mvn -B clean install -DskipTests -Dmaven.javadoc.skip=true
|
UV_PYTHON_DOWNLOADS=0
|
||||||
# FROM eclipse-temurin:21.0.3_9-jre-jammy
|
|
||||||
FROM quay.ocp.banorte.com/golden/openjdk-21:latest
|
WORKDIR /app
|
||||||
# COPY --from=builder /app/target/app-jovenes-service-orchestrator-0.0.1-SNAPSHOT.jar app.jar
|
|
||||||
COPY target/app-jovenes-service-orchestrator-0.0.1-SNAPSHOT.jar app.jar
|
# Install dependencies (cached separately from app code)
|
||||||
|
COPY pyproject.toml uv.lock ./
|
||||||
|
RUN uv sync --locked --no-install-project --no-cache
|
||||||
|
|
||||||
|
# Copy application code and install project
|
||||||
|
COPY . /app
|
||||||
|
RUN uv sync --locked --no-editable --no-cache
|
||||||
|
|
||||||
|
# --- Runtime stage ---
|
||||||
|
FROM python:3.12-slim-bookworm
|
||||||
|
|
||||||
|
RUN groupadd --system --gid 999 nonroot \
|
||||||
|
&& useradd --system --gid 999 --uid 999 --create-home nonroot
|
||||||
|
|
||||||
|
COPY --from=builder --chown=nonroot:nonroot /app /app
|
||||||
|
|
||||||
|
ENV PATH="/app/.venv/bin:$PATH" \
|
||||||
|
PYTHONUNBUFFERED=1
|
||||||
|
|
||||||
|
USER nonroot
|
||||||
|
WORKDIR /app
|
||||||
EXPOSE 8080
|
EXPOSE 8080
|
||||||
ENTRYPOINT ["java", "-jar", "app.jar"]
|
|
||||||
|
CMD ["uvicorn", "capa_de_integracion.main:app", "--host", "0.0.0.0", "--port", "8080", "--limit-concurrency", "1000", "--backlog", "2048"]
|
||||||
|
|||||||
@@ -1,25 +0,0 @@
|
|||||||
FROM python:3.12-slim
|
|
||||||
|
|
||||||
WORKDIR /app
|
|
||||||
|
|
||||||
# Install uv
|
|
||||||
COPY --from=ghcr.io/astral-sh/uv:latest /uv /usr/local/bin/uv
|
|
||||||
|
|
||||||
# Copy dependency files
|
|
||||||
COPY pyproject.toml uv.lock ./
|
|
||||||
|
|
||||||
# Install dependencies
|
|
||||||
RUN uv sync --frozen --no-dev
|
|
||||||
|
|
||||||
# Copy application code
|
|
||||||
COPY src ./src
|
|
||||||
|
|
||||||
# Expose port
|
|
||||||
EXPOSE 8080
|
|
||||||
|
|
||||||
# Set environment variables
|
|
||||||
ENV PYTHONUNBUFFERED=1
|
|
||||||
ENV PORT=8080
|
|
||||||
|
|
||||||
# Run the application
|
|
||||||
CMD ["uv", "run", "uvicorn", "capa_de_integracion.main:app", "--host", "0.0.0.0", "--port", "8080", "--workers", "4", "--limit-concurrency", "1000", "--backlog", "2048"]
|
|
||||||
@@ -20,7 +20,7 @@ dependencies = [
|
|||||||
"redis[hiredis]>=5.2.0",
|
"redis[hiredis]>=5.2.0",
|
||||||
"tenacity>=9.0.0",
|
"tenacity>=9.0.0",
|
||||||
"python-multipart>=0.0.12",
|
"python-multipart>=0.0.12",
|
||||||
"httpx>=0.27.0",
|
"httpx[http2]>=0.27.0",
|
||||||
]
|
]
|
||||||
|
|
||||||
[project.scripts]
|
[project.scripts]
|
||||||
|
|||||||
40
uv.lock
generated
40
uv.lock
generated
@@ -230,7 +230,7 @@ dependencies = [
|
|||||||
{ name = "google-cloud-dlp" },
|
{ name = "google-cloud-dlp" },
|
||||||
{ name = "google-cloud-firestore" },
|
{ name = "google-cloud-firestore" },
|
||||||
{ name = "google-generativeai" },
|
{ name = "google-generativeai" },
|
||||||
{ name = "httpx" },
|
{ name = "httpx", extra = ["http2"] },
|
||||||
{ name = "pydantic" },
|
{ name = "pydantic" },
|
||||||
{ name = "pydantic-settings" },
|
{ name = "pydantic-settings" },
|
||||||
{ name = "python-multipart" },
|
{ name = "python-multipart" },
|
||||||
@@ -261,7 +261,7 @@ requires-dist = [
|
|||||||
{ name = "google-cloud-dlp", specifier = ">=3.30.0" },
|
{ name = "google-cloud-dlp", specifier = ">=3.30.0" },
|
||||||
{ name = "google-cloud-firestore", specifier = ">=2.20.0" },
|
{ name = "google-cloud-firestore", specifier = ">=2.20.0" },
|
||||||
{ name = "google-generativeai", specifier = ">=0.8.0" },
|
{ name = "google-generativeai", specifier = ">=0.8.0" },
|
||||||
{ name = "httpx", specifier = ">=0.27.0" },
|
{ name = "httpx", extras = ["http2"], specifier = ">=0.27.0" },
|
||||||
{ name = "pydantic", specifier = ">=2.10.0" },
|
{ name = "pydantic", specifier = ">=2.10.0" },
|
||||||
{ name = "pydantic-settings", specifier = ">=2.6.0" },
|
{ name = "pydantic-settings", specifier = ">=2.6.0" },
|
||||||
{ name = "python-multipart", specifier = ">=0.0.12" },
|
{ name = "python-multipart", specifier = ">=0.0.12" },
|
||||||
@@ -1292,6 +1292,19 @@ wheels = [
|
|||||||
{ url = "https://files.pythonhosted.org/packages/04/4b/29cac41a4d98d144bf5f6d33995617b185d14b22401f75ca86f384e87ff1/h11-0.16.0-py3-none-any.whl", hash = "sha256:63cf8bbe7522de3bf65932fda1d9c2772064ffb3dae62d55932da54b31cb6c86", size = 37515, upload-time = "2025-04-24T03:35:24.344Z" },
|
{ url = "https://files.pythonhosted.org/packages/04/4b/29cac41a4d98d144bf5f6d33995617b185d14b22401f75ca86f384e87ff1/h11-0.16.0-py3-none-any.whl", hash = "sha256:63cf8bbe7522de3bf65932fda1d9c2772064ffb3dae62d55932da54b31cb6c86", size = 37515, upload-time = "2025-04-24T03:35:24.344Z" },
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "h2"
|
||||||
|
version = "4.3.0"
|
||||||
|
source = { registry = "https://pypi.org/simple" }
|
||||||
|
dependencies = [
|
||||||
|
{ name = "hpack" },
|
||||||
|
{ name = "hyperframe" },
|
||||||
|
]
|
||||||
|
sdist = { url = "https://files.pythonhosted.org/packages/1d/17/afa56379f94ad0fe8defd37d6eb3f89a25404ffc71d4d848893d270325fc/h2-4.3.0.tar.gz", hash = "sha256:6c59efe4323fa18b47a632221a1888bd7fde6249819beda254aeca909f221bf1", size = 2152026, upload-time = "2025-08-23T18:12:19.778Z" }
|
||||||
|
wheels = [
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/69/b2/119f6e6dcbd96f9069ce9a2665e0146588dc9f88f29549711853645e736a/h2-4.3.0-py3-none-any.whl", hash = "sha256:c438f029a25f7945c69e0ccf0fb951dc3f73a5f6412981daee861431b70e2bdd", size = 61779, upload-time = "2025-08-23T18:12:17.779Z" },
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "hiredis"
|
name = "hiredis"
|
||||||
version = "3.3.0"
|
version = "3.3.0"
|
||||||
@@ -1352,6 +1365,15 @@ wheels = [
|
|||||||
{ url = "https://files.pythonhosted.org/packages/b2/2f/8a0befeed8bbe142d5a6cf3b51e8cbe019c32a64a596b0ebcbc007a8f8f1/hiredis-3.3.0-cp314-cp314t-win_amd64.whl", hash = "sha256:b442b6ab038a6f3b5109874d2514c4edf389d8d8b553f10f12654548808683bc", size = 23808, upload-time = "2025-10-14T16:33:04.965Z" },
|
{ url = "https://files.pythonhosted.org/packages/b2/2f/8a0befeed8bbe142d5a6cf3b51e8cbe019c32a64a596b0ebcbc007a8f8f1/hiredis-3.3.0-cp314-cp314t-win_amd64.whl", hash = "sha256:b442b6ab038a6f3b5109874d2514c4edf389d8d8b553f10f12654548808683bc", size = 23808, upload-time = "2025-10-14T16:33:04.965Z" },
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "hpack"
|
||||||
|
version = "4.1.0"
|
||||||
|
source = { registry = "https://pypi.org/simple" }
|
||||||
|
sdist = { url = "https://files.pythonhosted.org/packages/2c/48/71de9ed269fdae9c8057e5a4c0aa7402e8bb16f2c6e90b3aa53327b113f8/hpack-4.1.0.tar.gz", hash = "sha256:ec5eca154f7056aa06f196a557655c5b009b382873ac8d1e66e79e87535f1dca", size = 51276, upload-time = "2025-01-22T21:44:58.347Z" }
|
||||||
|
wheels = [
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/07/c6/80c95b1b2b94682a72cbdbfb85b81ae2daffa4291fbfa1b1464502ede10d/hpack-4.1.0-py3-none-any.whl", hash = "sha256:157ac792668d995c657d93111f46b4535ed114f0c9c8d672271bbec7eae1b496", size = 34357, upload-time = "2025-01-22T21:44:56.92Z" },
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "httpcore"
|
name = "httpcore"
|
||||||
version = "1.0.9"
|
version = "1.0.9"
|
||||||
@@ -1421,6 +1443,20 @@ wheels = [
|
|||||||
{ url = "https://files.pythonhosted.org/packages/2a/39/e50c7c3a983047577ee07d2a9e53faf5a69493943ec3f6a384bdc792deb2/httpx-0.28.1-py3-none-any.whl", hash = "sha256:d909fcccc110f8c7faf814ca82a9a4d816bc5a6dbfea25d6591d6985b8ba59ad", size = 73517, upload-time = "2024-12-06T15:37:21.509Z" },
|
{ url = "https://files.pythonhosted.org/packages/2a/39/e50c7c3a983047577ee07d2a9e53faf5a69493943ec3f6a384bdc792deb2/httpx-0.28.1-py3-none-any.whl", hash = "sha256:d909fcccc110f8c7faf814ca82a9a4d816bc5a6dbfea25d6591d6985b8ba59ad", size = 73517, upload-time = "2024-12-06T15:37:21.509Z" },
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[package.optional-dependencies]
|
||||||
|
http2 = [
|
||||||
|
{ name = "h2" },
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "hyperframe"
|
||||||
|
version = "6.1.0"
|
||||||
|
source = { registry = "https://pypi.org/simple" }
|
||||||
|
sdist = { url = "https://files.pythonhosted.org/packages/02/e7/94f8232d4a74cc99514c13a9f995811485a6903d48e5d952771ef6322e30/hyperframe-6.1.0.tar.gz", hash = "sha256:f630908a00854a7adeabd6382b43923a4c4cd4b821fcb527e6ab9e15382a3b08", size = 26566, upload-time = "2025-01-22T21:41:49.302Z" }
|
||||||
|
wheels = [
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/48/30/47d0bf6072f7252e6521f3447ccfa40b421b6824517f82854703d0f5a98b/hyperframe-6.1.0-py3-none-any.whl", hash = "sha256:b03380493a519fce58ea5af42e4a42317bf9bd425596f7a0835ffce80f1a42e5", size = 13007, upload-time = "2025-01-22T21:41:47.295Z" },
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "idna"
|
name = "idna"
|
||||||
version = "3.11"
|
version = "3.11"
|
||||||
|
|||||||
Reference in New Issue
Block a user