From 4bba5fe32476c3e8713d0bc06d41cfd6a3e5452a Mon Sep 17 00:00:00 2001 From: Anikesh Suresh Date: Fri, 22 Nov 2024 13:33:35 +0000 Subject: [PATCH 01/14] added production dockerfile, started multi-stage build #5 --- Dockerfile.prod | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) create mode 100644 Dockerfile.prod diff --git a/Dockerfile.prod b/Dockerfile.prod new file mode 100644 index 0000000..5ec8e63 --- /dev/null +++ b/Dockerfile.prod @@ -0,0 +1,31 @@ +FROM python:3.12.7-alpine3.20@sha256:edd1d8559c585e1e9a9b79de44ac27f8ac32cb0c7323e112ae6870ceeecd8dbf + + +COPY requirements.txt ./ + +RUN set -eux; \ + \ + # Install pip dependencies \ + python3 -m pip install --no-cache-dir -r requirements.txt; + +FROM python:3.12.7-alpine3.20@sha256:edd1d8559c585e1e9a9b79de44ac27f8ac32cb0c7323e112ae6870ceeecd8dbf + +WORKDIR /object-storage-api-run + + +COPY README.md ./ +COPY object_storage_api/ object_storage_api/ + +RUN set -eux; \ + \ + # Create loging.ini from its .example file \ + cp object_storage_api/logging.example.ini object_storage_api/logging.ini; \ + \ + # Create a non-root user to run as \ + addgroup -S object-storage-api; \ + adduser -S -D -G object-storage-api -H -h /object-storage-api-run object-storage-api; + +USER object-storage-api + +CMD ["uvicorn", "object_storage_api.main:app", "--app-dir", "/object-storage-api-run", "--host", "0.0.0.0", "--port", "8000"] +EXPOSE 8000 From cd4ca0e8fdf89a1d47e36c6d8d81c679f16d9d33 Mon Sep 17 00:00:00 2001 From: Anikesh Suresh Date: Mon, 25 Nov 2024 14:06:10 +0000 Subject: [PATCH 02/14] add production dockerfile and multi-stage build for installations #5 --- Dockerfile.prod | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/Dockerfile.prod b/Dockerfile.prod index 5ec8e63..3c929bf 100644 --- a/Dockerfile.prod +++ b/Dockerfile.prod @@ -1,5 +1,4 @@ -FROM python:3.12.7-alpine3.20@sha256:edd1d8559c585e1e9a9b79de44ac27f8ac32cb0c7323e112ae6870ceeecd8dbf - +FROM python:3.12.7-alpine3.20@sha256:edd1d8559c585e1e9a9b79de44ac27f8ac32cb0c7323e112ae6870ceeecd8dbf AS stage1 COPY requirements.txt ./ @@ -12,6 +11,8 @@ FROM python:3.12.7-alpine3.20@sha256:edd1d8559c585e1e9a9b79de44ac27f8ac32cb0c732 WORKDIR /object-storage-api-run +COPY --from=stage1 /usr/local/lib/python3.12/site-packages /usr/local/lib/python3.12/site-packages +COPY --from=stage1 /usr/local/bin /usr/local/bin COPY README.md ./ COPY object_storage_api/ object_storage_api/ From ba8bfc3f779da5744d3dd30e3829a3bb2319c666 Mon Sep 17 00:00:00 2001 From: Anikesh Suresh Date: Mon, 25 Nov 2024 16:32:51 +0000 Subject: [PATCH 03/14] change usergroup to nobody #5 --- Dockerfile.prod | 14 +++++--------- 1 file changed, 5 insertions(+), 9 deletions(-) diff --git a/Dockerfile.prod b/Dockerfile.prod index 3c929bf..b610625 100644 --- a/Dockerfile.prod +++ b/Dockerfile.prod @@ -1,4 +1,4 @@ -FROM python:3.12.7-alpine3.20@sha256:edd1d8559c585e1e9a9b79de44ac27f8ac32cb0c7323e112ae6870ceeecd8dbf AS stage1 +FROM python:3.12.7-alpine3.20@sha256:edd1d8559c585e1e9a9b79de44ac27f8ac32cb0c7323e112ae6870ceeecd8dbf AS builder COPY requirements.txt ./ @@ -11,8 +11,8 @@ FROM python:3.12.7-alpine3.20@sha256:edd1d8559c585e1e9a9b79de44ac27f8ac32cb0c732 WORKDIR /object-storage-api-run -COPY --from=stage1 /usr/local/lib/python3.12/site-packages /usr/local/lib/python3.12/site-packages -COPY --from=stage1 /usr/local/bin /usr/local/bin +COPY --from=builder /usr/local/lib/python3.12/site-packages /usr/local/lib/python3.12/site-packages +COPY --from=builder /usr/local/bin /usr/local/bin COPY README.md ./ COPY object_storage_api/ object_storage_api/ @@ -20,13 +20,9 @@ COPY object_storage_api/ object_storage_api/ RUN set -eux; \ \ # Create loging.ini from its .example file \ - cp object_storage_api/logging.example.ini object_storage_api/logging.ini; \ - \ - # Create a non-root user to run as \ - addgroup -S object-storage-api; \ - adduser -S -D -G object-storage-api -H -h /object-storage-api-run object-storage-api; + cp object_storage_api/logging.example.ini object_storage_api/logging.ini; -USER object-storage-api +USER nobody CMD ["uvicorn", "object_storage_api.main:app", "--app-dir", "/object-storage-api-run", "--host", "0.0.0.0", "--port", "8000"] EXPOSE 8000 From 05a70824ca4be22cee7fa5df841e57688b373913 Mon Sep 17 00:00:00 2001 From: Anikesh Suresh Date: Tue, 26 Nov 2024 08:55:10 +0000 Subject: [PATCH 04/14] add CI image upload workflow #5 --- .github/workflows/.ci.yml | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) diff --git a/.github/workflows/.ci.yml b/.github/workflows/.ci.yml index aafb538..bb9db78 100644 --- a/.github/workflows/.ci.yml +++ b/.github/workflows/.ci.yml @@ -106,3 +106,34 @@ jobs: - name: Output docker logs (minio) if: failure() run: docker logs object-storage-api-minio-1 + docker: + # This job triggers only if all the other jobs succeed. It builds the Docker image and if successful, + # it pushes it to Harbor. + needs: [linting, unit-tests, e2e-tests] + name: Docker + runs-on: ubuntu-latest + steps: + - name: Check out repo + uses: actions/checkout@eef61447b9ff4aafe5dcd4e0bbf5d482be7e7871 # v4.2.1 + + - name: Login to Harbor + uses: docker/login-action@9780b0c442fbb1117ed29e0efdff1e18412f7567 # v3.3.0 + with: + registry: ${{ secrets.HARBOR_URL }} + username: ${{ secrets.HARBOR_USERNAME }} + password: ${{ secrets.HARBOR_TOKEN }} + + - name: Extract metadata (tags, labels) for Docker + id: meta + uses: docker/metadata-action@8e5442c4ef9f78752691e2d8f8d19755c6f78e81 # v5.5.1 + with: + images: ${{ secrets.HARBOR_URL }}/object-storage-api + + - name: Build and push Docker image to Harbor + uses: docker/build-push-action@4f58ea79222b3b9dc2c8bbdd6debcef730109a75 # v6.9.0 + with: + context: . + file: ./Dockerfile.prod + push: true + tags: ${{ steps.meta.outputs.tags }} + labels: ${{ steps.meta.outputs.labels }} \ No newline at end of file From 4e06f88b1a4581fbf0ac1c59d3ac3fd44b224555 Mon Sep 17 00:00:00 2001 From: Anikesh Suresh Date: Wed, 15 Jan 2025 14:19:55 +0000 Subject: [PATCH 05/14] add tag github workflow, and simplified prod file TODO: Investigate changing to 1 dockerfile for repo #5 --- .github/workflows/.ci.yml | 15 ++++++++++++--- Dockerfile.prod | 24 +++++------------------- 2 files changed, 17 insertions(+), 22 deletions(-) diff --git a/.github/workflows/.ci.yml b/.github/workflows/.ci.yml index bb9db78..e4c7de9 100644 --- a/.github/workflows/.ci.yml +++ b/.github/workflows/.ci.yml @@ -1,6 +1,11 @@ name: CI on: workflow_dispatch: + inputs: + push-docker-image-to-harbor: + description: 'Push Docker Image to Harbor' + type: boolean + default: false pull_request: push: branches: @@ -112,6 +117,8 @@ jobs: needs: [linting, unit-tests, e2e-tests] name: Docker runs-on: ubuntu-latest + env: + PUSH_DOCKER_IMAGE_TO_HARBOR: ${{ inputs.push-docker-image-to-harbor != null && inputs.push-docker-image-to-harbor || 'false' }} steps: - name: Check out repo uses: actions/checkout@eef61447b9ff4aafe5dcd4e0bbf5d482be7e7871 # v4.2.1 @@ -129,11 +136,13 @@ jobs: with: images: ${{ secrets.HARBOR_URL }}/object-storage-api - - name: Build and push Docker image to Harbor + - name: ${{ fromJSON(env.PUSH_DOCKER_IMAGE_TO_HARBOR) && 'Build and push Docker image to Harbor' || 'Build Docker image' }} uses: docker/build-push-action@4f58ea79222b3b9dc2c8bbdd6debcef730109a75 # v6.9.0 with: context: . file: ./Dockerfile.prod - push: true + push: ${{ fromJSON(env.PUSH_DOCKER_IMAGE_TO_HARBOR) }} tags: ${{ steps.meta.outputs.tags }} - labels: ${{ steps.meta.outputs.labels }} \ No newline at end of file + labels: ${{ steps.meta.outputs.labels }} + target: prod + diff --git a/Dockerfile.prod b/Dockerfile.prod index b610625..0f04f0b 100644 --- a/Dockerfile.prod +++ b/Dockerfile.prod @@ -1,28 +1,14 @@ -FROM python:3.12.7-alpine3.20@sha256:edd1d8559c585e1e9a9b79de44ac27f8ac32cb0c7323e112ae6870ceeecd8dbf AS builder - -COPY requirements.txt ./ - -RUN set -eux; \ - \ - # Install pip dependencies \ - python3 -m pip install --no-cache-dir -r requirements.txt; - FROM python:3.12.7-alpine3.20@sha256:edd1d8559c585e1e9a9b79de44ac27f8ac32cb0c7323e112ae6870ceeecd8dbf WORKDIR /object-storage-api-run -COPY --from=builder /usr/local/lib/python3.12/site-packages /usr/local/lib/python3.12/site-packages -COPY --from=builder /usr/local/bin /usr/local/bin - -COPY README.md ./ +COPY requirements.txt ./ COPY object_storage_api/ object_storage_api/ -RUN set -eux; \ +RUN --mount=type=cache,target=/root/.cache \ + set -eux; \ \ - # Create loging.ini from its .example file \ - cp object_storage_api/logging.example.ini object_storage_api/logging.ini; - -USER nobody + python3 -m pip install -r requirements.txt; -CMD ["uvicorn", "object_storage_api.main:app", "--app-dir", "/object-storage-api-run", "--host", "0.0.0.0", "--port", "8000"] +CMD ["fastapi", "run", "object_storage_api/main.py", "--host", "0.0.0.0", "--port", "8000"] EXPOSE 8000 From a2d28e01b0d132277e3cb7c8ae147bc5b6d194ab Mon Sep 17 00:00:00 2001 From: Anikesh Suresh Date: Thu, 16 Jan 2025 08:34:55 +0000 Subject: [PATCH 06/14] matched prod python version to dev #5 --- .github/workflows/.ci.yml | 1 - Dockerfile.prod | 2 +- docker-compose.yml | 4 +++- 3 files changed, 4 insertions(+), 3 deletions(-) diff --git a/.github/workflows/.ci.yml b/.github/workflows/.ci.yml index b723e63..0319cd9 100644 --- a/.github/workflows/.ci.yml +++ b/.github/workflows/.ci.yml @@ -144,5 +144,4 @@ jobs: push: ${{ fromJSON(env.PUSH_DOCKER_IMAGE_TO_HARBOR) }} tags: ${{ steps.meta.outputs.tags }} labels: ${{ steps.meta.outputs.labels }} - target: prod diff --git a/Dockerfile.prod b/Dockerfile.prod index 0f04f0b..b491bb1 100644 --- a/Dockerfile.prod +++ b/Dockerfile.prod @@ -1,4 +1,4 @@ -FROM python:3.12.7-alpine3.20@sha256:edd1d8559c585e1e9a9b79de44ac27f8ac32cb0c7323e112ae6870ceeecd8dbf +FROM python:3.12.8-alpine3.20@sha256:0c4f778362f30cc50ff734a3e9e7f3b2ae876d8386f470e0c3ee1ab299cec21b WORKDIR /object-storage-api-run diff --git a/docker-compose.yml b/docker-compose.yml index 0323df8..3726b99 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -1,7 +1,9 @@ services: object-storage-api: container_name: object_storage_api_container - build: . + build: + context: . + dockerfile: Dockerfile.prod volumes: - ./object_storage_api:/object-storage-api-run/object_storage_api - ./keys:/object-storage-api-run/keys From 1b2aa49e0ae06781192b100d16b91c2d574062a8 Mon Sep 17 00:00:00 2001 From: Anikesh Suresh Date: Thu, 16 Jan 2025 09:25:52 +0000 Subject: [PATCH 07/14] test-harbor-push #5 --- Dockerfile.prod | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Dockerfile.prod b/Dockerfile.prod index b491bb1..19a55d6 100644 --- a/Dockerfile.prod +++ b/Dockerfile.prod @@ -10,5 +10,7 @@ RUN --mount=type=cache,target=/root/.cache \ \ python3 -m pip install -r requirements.txt; +RUN ls + CMD ["fastapi", "run", "object_storage_api/main.py", "--host", "0.0.0.0", "--port", "8000"] EXPOSE 8000 From f97a99128346eb4f9f3351875a6ebeb3aba13e01 Mon Sep 17 00:00:00 2001 From: Anikesh Suresh Date: Fri, 17 Jan 2025 13:10:36 +0000 Subject: [PATCH 08/14] Address PR Review Comments #5 --- .github/workflows/.ci.yml | 4 ++-- docker-compose.yml | 4 +--- 2 files changed, 3 insertions(+), 5 deletions(-) diff --git a/.github/workflows/.ci.yml b/.github/workflows/.ci.yml index 0319cd9..3d970b8 100644 --- a/.github/workflows/.ci.yml +++ b/.github/workflows/.ci.yml @@ -112,8 +112,8 @@ jobs: if: failure() run: docker logs object-storage-api-minio-1 docker: - # This job triggers only if all the other jobs succeed. It builds the Docker image and if successful, - # it pushes it to Harbor. + # This job triggers only if all the other jobs succeed. It builds the Docker image + # and if run manually from Github Actions, it pushes to Harbor. needs: [linting, unit-tests, e2e-tests] name: Docker runs-on: ubuntu-latest diff --git a/docker-compose.yml b/docker-compose.yml index 3726b99..0323df8 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -1,9 +1,7 @@ services: object-storage-api: container_name: object_storage_api_container - build: - context: . - dockerfile: Dockerfile.prod + build: . volumes: - ./object_storage_api:/object-storage-api-run/object_storage_api - ./keys:/object-storage-api-run/keys From 7ec2aec2f98398fd0fcdd90c8d76b8b63c6cfa39 Mon Sep 17 00:00:00 2001 From: Anikesh Suresh Date: Fri, 24 Jan 2025 11:30:11 +0000 Subject: [PATCH 09/14] Merged dockerfiles into 1 file, and split compose files up #5 --- Dockerfile | 38 +++++++++++- Dockerfile.prod | 16 ----- docker-compose.yml => docker-compose-dev.yml | 4 +- docker-compose-test.yml | 64 ++++++++++++++++++++ 4 files changed, 104 insertions(+), 18 deletions(-) delete mode 100644 Dockerfile.prod rename docker-compose.yml => docker-compose-dev.yml (97%) create mode 100644 docker-compose-test.yml diff --git a/Dockerfile b/Dockerfile index 145cae9..fcaeaa9 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,4 +1,4 @@ -FROM python:3.12.8-alpine3.20@sha256:0c4f778362f30cc50ff734a3e9e7f3b2ae876d8386f470e0c3ee1ab299cec21b +FROM python:3.12.8-alpine3.20@sha256:0c4f778362f30cc50ff734a3e9e7f3b2ae876d8386f470e0c3ee1ab299cec21b as base WORKDIR /object-storage-api-run @@ -10,5 +10,41 @@ RUN --mount=type=cache,target=/root/.cache \ \ python3 -m pip install -r requirements.txt; +FROM python:3.12.8-alpine3.20@sha256:0c4f778362f30cc50ff734a3e9e7f3b2ae876d8386f470e0c3ee1ab299cec21b as dev + +WORKDIR /object-storage-api-run + +COPY --from=base /usr/local/lib/python3.12/site-packages /usr/local/lib/python3.12/site-packages +COPY --from=base /usr/local/bin /usr/local/bin +COPY object_storage_api/ object_storage_api/ + CMD ["fastapi", "dev", "object_storage_api/main.py", "--host", "0.0.0.0", "--port", "8000"] EXPOSE 8000 + +FROM dev as test + +WORKDIR /object-storage-api-run + +COPY test/ test/ + +CMD ["pytest", "--config-file", "test/pytest.ini", "test/", "--cov"] + +FROM python:3.12.8-alpine3.20@sha256:0c4f778362f30cc50ff734a3e9e7f3b2ae876d8386f470e0c3ee1ab299cec21b as prod + +WORKDIR /object-storage-api-run + +COPY requirements.txt ./ +COPY object_storage_api/ object_storage_api/ + +RUN --mount=type=cache,target=/root/.cache \ + set -eux; \ + \ + python3 -m pip install --no-cache-dir -r requirements.txt; \ + # Create a non-root user to run as \ + addgroup -S object-storage-api; \ + adduser -S -D -G object-storage-api -H -h /object-storage-api-run object-storage-api; + +USER object-storage-api + +CMD ["fastapi", "run", "object_storage_api/main.py", "--host", "0.0.0.0", "--port", "8000"] +EXPOSE 8000 \ No newline at end of file diff --git a/Dockerfile.prod b/Dockerfile.prod deleted file mode 100644 index 19a55d6..0000000 --- a/Dockerfile.prod +++ /dev/null @@ -1,16 +0,0 @@ -FROM python:3.12.8-alpine3.20@sha256:0c4f778362f30cc50ff734a3e9e7f3b2ae876d8386f470e0c3ee1ab299cec21b - -WORKDIR /object-storage-api-run - -COPY requirements.txt ./ -COPY object_storage_api/ object_storage_api/ - -RUN --mount=type=cache,target=/root/.cache \ - set -eux; \ - \ - python3 -m pip install -r requirements.txt; - -RUN ls - -CMD ["fastapi", "run", "object_storage_api/main.py", "--host", "0.0.0.0", "--port", "8000"] -EXPOSE 8000 diff --git a/docker-compose.yml b/docker-compose-dev.yml similarity index 97% rename from docker-compose.yml rename to docker-compose-dev.yml index 0323df8..1d54245 100644 --- a/docker-compose.yml +++ b/docker-compose-dev.yml @@ -1,7 +1,9 @@ services: object-storage-api: container_name: object_storage_api_container - build: . + build: + context: . + target: dev volumes: - ./object_storage_api:/object-storage-api-run/object_storage_api - ./keys:/object-storage-api-run/keys diff --git a/docker-compose-test.yml b/docker-compose-test.yml new file mode 100644 index 0000000..67894ff --- /dev/null +++ b/docker-compose-test.yml @@ -0,0 +1,64 @@ +services: + object-storage-api: + container_name: object_storage_api_container + build: + context: . + target: test + volumes: + - ./object_storage_api:/object-storage-api-run/object_storage_api + - ./keys:/object-storage-api-run/keys + restart: on-failure + ports: + - 8002:8000 + depends_on: + - mongo-db + - minio + environment: + DATABASE__HOST_AND_OPTIONS: object_storage_api_mongodb_container:27017/?authMechanism=SCRAM-SHA-256&authSource=admin + extra_hosts: + # Want to use localhost for MinIO connection so the presigned URLs are correct but also want to avoid using host + # networking + - "localhost:host-gateway" + + mongo-db: + image: mongo:7.0-jammy + container_name: object_storage_api_mongodb_container + volumes: + - ./mongodb/data:/data/db + restart: always + ports: + - 27018:27017 + environment: + MONGO_INITDB_ROOT_USERNAME: root + MONGO_INITDB_ROOT_PASSWORD: example + + minio: + image: minio/minio:RELEASE.2024-09-13T20-26-02Z + container_name: object_storage_minio_container + command: minio server /data + volumes: + - ./minio/data:/data + ports: + - 9000:9000 + - 9001:9001 + environment: + MINIO_ROOT_USER: root + MINIO_ROOT_PASSWORD: example_password + MINIO_ADDRESS: ":9000" + MINIO_CONSOLE_ADDRESS: ":9001" + network_mode: "host" + + # From https://stackoverflow.com/questions/66412289/minio-add-a-public-bucket-with-docker-compose + minio_create_buckets: + image: minio/mc + container_name: object_storage_minio_mc_container + depends_on: + - minio + entrypoint: > + /bin/sh -c " + /usr/bin/mc alias set object-storage http://localhost:9000 root example_password; + /usr/bin/mc mb object-storage/object-storage; + /usr/bin/mc mb object-storage/test-object-storage; + exit 0; + " + network_mode: "host" From 9a87e9c5b24a413b5ee8406a32ea3de0cdef0296 Mon Sep 17 00:00:00 2001 From: Anikesh Suresh Date: Fri, 24 Jan 2025 11:52:43 +0000 Subject: [PATCH 10/14] fix for github workflow #5 --- .github/workflows/.ci.yml | 7 +++---- docker-compose-dev.yml => docker-compose.dev.yml | 0 docker-compose-test.yml => docker-compose.test.yml | 0 3 files changed, 3 insertions(+), 4 deletions(-) rename docker-compose-dev.yml => docker-compose.dev.yml (100%) rename docker-compose-test.yml => docker-compose.test.yml (100%) diff --git a/.github/workflows/.ci.yml b/.github/workflows/.ci.yml index 3d970b8..6b435b5 100644 --- a/.github/workflows/.ci.yml +++ b/.github/workflows/.ci.yml @@ -95,11 +95,11 @@ jobs: # Sleep 10 seconds to give time for containers to start - name: Start MongoDB and MinIO run: | - docker compose up -d mongo-db minio minio_create_buckets + docker compose -f docker-compose.test.yml up -d mongo-db minio minio_create_buckets sleep 10 - name: Create MinIO buckets run: | - docker compose up minio_create_buckets + docker compose -f docker-compose.test.yml up minio_create_buckets - name: Run e2e tests run: pytest -c test/pytest.ini test/e2e/ --cov @@ -140,8 +140,7 @@ jobs: uses: docker/build-push-action@4f58ea79222b3b9dc2c8bbdd6debcef730109a75 # v6.9.0 with: context: . - file: ./Dockerfile.prod push: ${{ fromJSON(env.PUSH_DOCKER_IMAGE_TO_HARBOR) }} tags: ${{ steps.meta.outputs.tags }} labels: ${{ steps.meta.outputs.labels }} - + target: prod \ No newline at end of file diff --git a/docker-compose-dev.yml b/docker-compose.dev.yml similarity index 100% rename from docker-compose-dev.yml rename to docker-compose.dev.yml diff --git a/docker-compose-test.yml b/docker-compose.test.yml similarity index 100% rename from docker-compose-test.yml rename to docker-compose.test.yml From 823c2944e694f811b2bd21ae812d47630d260718 Mon Sep 17 00:00:00 2001 From: Anikesh Suresh Date: Mon, 27 Jan 2025 14:55:31 +0000 Subject: [PATCH 11/14] test using ENV variable to set state #5 --- .github/workflows/.ci.yml | 4 ++-- docker-compose.dev.yml | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/.ci.yml b/.github/workflows/.ci.yml index 6b435b5..53f1926 100644 --- a/.github/workflows/.ci.yml +++ b/.github/workflows/.ci.yml @@ -95,11 +95,11 @@ jobs: # Sleep 10 seconds to give time for containers to start - name: Start MongoDB and MinIO run: | - docker compose -f docker-compose.test.yml up -d mongo-db minio minio_create_buckets + TARGET_STAGE=test docker compose -f docker-compose.dev.yml up -d mongo-db minio minio_create_buckets sleep 10 - name: Create MinIO buckets run: | - docker compose -f docker-compose.test.yml up minio_create_buckets + TARGET_STAGE=test docker compose -f docker-compose.dev.yml up minio_create_buckets - name: Run e2e tests run: pytest -c test/pytest.ini test/e2e/ --cov diff --git a/docker-compose.dev.yml b/docker-compose.dev.yml index 1d54245..ca1699c 100644 --- a/docker-compose.dev.yml +++ b/docker-compose.dev.yml @@ -3,7 +3,7 @@ services: container_name: object_storage_api_container build: context: . - target: dev + target: ${TARGET_STAGE:-dev} volumes: - ./object_storage_api:/object-storage-api-run/object_storage_api - ./keys:/object-storage-api-run/keys From 11ae8d0a1e00a1aa2777644f8c245af50a06026b Mon Sep 17 00:00:00 2001 From: Anikesh Suresh Date: Wed, 29 Jan 2025 12:05:40 +0000 Subject: [PATCH 12/14] Address some PR comments TODO: Address container problem #5 --- .github/workflows/.ci.yml | 4 ++-- Dockerfile | 14 +++----------- docker-compose.dev.yml | 2 +- docker-compose.test.yml | 4 ++-- 4 files changed, 8 insertions(+), 16 deletions(-) diff --git a/.github/workflows/.ci.yml b/.github/workflows/.ci.yml index 53f1926..6b435b5 100644 --- a/.github/workflows/.ci.yml +++ b/.github/workflows/.ci.yml @@ -95,11 +95,11 @@ jobs: # Sleep 10 seconds to give time for containers to start - name: Start MongoDB and MinIO run: | - TARGET_STAGE=test docker compose -f docker-compose.dev.yml up -d mongo-db minio minio_create_buckets + docker compose -f docker-compose.test.yml up -d mongo-db minio minio_create_buckets sleep 10 - name: Create MinIO buckets run: | - TARGET_STAGE=test docker compose -f docker-compose.dev.yml up minio_create_buckets + docker compose -f docker-compose.test.yml up minio_create_buckets - name: Run e2e tests run: pytest -c test/pytest.ini test/e2e/ --cov diff --git a/Dockerfile b/Dockerfile index fcaeaa9..c689b6f 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,22 +1,14 @@ -FROM python:3.12.8-alpine3.20@sha256:0c4f778362f30cc50ff734a3e9e7f3b2ae876d8386f470e0c3ee1ab299cec21b as base +FROM python:3.12.8-alpine3.20@sha256:0c4f778362f30cc50ff734a3e9e7f3b2ae876d8386f470e0c3ee1ab299cec21b as dev WORKDIR /object-storage-api-run -COPY requirements.txt ./ +COPY pyproject.toml ./ COPY object_storage_api/ object_storage_api/ RUN --mount=type=cache,target=/root/.cache \ set -eux; \ \ - python3 -m pip install -r requirements.txt; - -FROM python:3.12.8-alpine3.20@sha256:0c4f778362f30cc50ff734a3e9e7f3b2ae876d8386f470e0c3ee1ab299cec21b as dev - -WORKDIR /object-storage-api-run - -COPY --from=base /usr/local/lib/python3.12/site-packages /usr/local/lib/python3.12/site-packages -COPY --from=base /usr/local/bin /usr/local/bin -COPY object_storage_api/ object_storage_api/ + python3 -m pip install -r .; CMD ["fastapi", "dev", "object_storage_api/main.py", "--host", "0.0.0.0", "--port", "8000"] EXPOSE 8000 diff --git a/docker-compose.dev.yml b/docker-compose.dev.yml index ca1699c..1d54245 100644 --- a/docker-compose.dev.yml +++ b/docker-compose.dev.yml @@ -3,7 +3,7 @@ services: container_name: object_storage_api_container build: context: . - target: ${TARGET_STAGE:-dev} + target: dev volumes: - ./object_storage_api:/object-storage-api-run/object_storage_api - ./keys:/object-storage-api-run/keys diff --git a/docker-compose.test.yml b/docker-compose.test.yml index 67894ff..89de156 100644 --- a/docker-compose.test.yml +++ b/docker-compose.test.yml @@ -1,6 +1,6 @@ services: - object-storage-api: - container_name: object_storage_api_container + object-storage-api-test: + container_name: object_storage_api_container_test build: context: . target: test From 2decebda37025dddb7c4c05f262d752a3d9c03d3 Mon Sep 17 00:00:00 2001 From: Anikesh Suresh Date: Wed, 29 Jan 2025 13:43:59 +0000 Subject: [PATCH 13/14] Possible implementation to address github workflow issue #5 --- .github/workflows/.ci.yml | 8 ++++++-- Dockerfile | 14 +++++++++++++- 2 files changed, 19 insertions(+), 3 deletions(-) diff --git a/.github/workflows/.ci.yml b/.github/workflows/.ci.yml index 6b435b5..d13168a 100644 --- a/.github/workflows/.ci.yml +++ b/.github/workflows/.ci.yml @@ -61,7 +61,9 @@ jobs: run: cp object_storage_api/logging.example.ini object_storage_api/logging.ini - name: Run unit tests - run: pytest -c test/pytest.ini test/unit/ --cov + run: | + docker build --target unit-test -t object-storage-api:unit-test . + docker run object-storage-api:unit-test - name: Upload coverage reports to Codecov if: success() @@ -102,7 +104,9 @@ jobs: docker compose -f docker-compose.test.yml up minio_create_buckets - name: Run e2e tests - run: pytest -c test/pytest.ini test/e2e/ --cov + run: | + docker build --target e2e-test -t object-storage-api:e2e-test . + docker run object-storage-api:e2e-test - name: Output docker logs (mongodb) if: failure() diff --git a/Dockerfile b/Dockerfile index c689b6f..9eed1d3 100644 --- a/Dockerfile +++ b/Dockerfile @@ -13,12 +13,24 @@ RUN --mount=type=cache,target=/root/.cache \ CMD ["fastapi", "dev", "object_storage_api/main.py", "--host", "0.0.0.0", "--port", "8000"] EXPOSE 8000 -FROM dev as test +FROM dev as unit-test WORKDIR /object-storage-api-run COPY test/ test/ +CMD ["pytest", "--config-file", "test/pytest.ini", "test/unit", "--cov"] + +FROM unit-test as e2e-test + +WORKDIR /object-storage-api-run + +CMD ["pytest", "--config-file", "test/pytest.ini", "test/e2e", "--cov"] + +FROM unit-test as test + +WORKDIR /object-storage-api-run + CMD ["pytest", "--config-file", "test/pytest.ini", "test/", "--cov"] FROM python:3.12.8-alpine3.20@sha256:0c4f778362f30cc50ff734a3e9e7f3b2ae876d8386f470e0c3ee1ab299cec21b as prod From 2f745183f636dc556e52f45025b67db70acd8278 Mon Sep 17 00:00:00 2001 From: Anikesh Suresh Date: Wed, 29 Jan 2025 13:50:27 +0000 Subject: [PATCH 14/14] Possible implementation to address github workflow issue #5 --- Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Dockerfile b/Dockerfile index 9eed1d3..b898c41 100644 --- a/Dockerfile +++ b/Dockerfile @@ -8,7 +8,7 @@ COPY object_storage_api/ object_storage_api/ RUN --mount=type=cache,target=/root/.cache \ set -eux; \ \ - python3 -m pip install -r .; + python3 -m pip install -r pyproject.toml; CMD ["fastapi", "dev", "object_storage_api/main.py", "--host", "0.0.0.0", "--port", "8000"] EXPOSE 8000