diff --git a/.github/workflows/build_docker_image.yml b/.github/workflows/build_docker_image.yml new file mode 100644 index 0000000..41be1da --- /dev/null +++ b/.github/workflows/build_docker_image.yml @@ -0,0 +1,49 @@ +name: Build docker image + +on: + push: + branches: + - 'main' + +jobs: + Build-Docker-Image: + runs-on: ubuntu-latest + steps: + - + name: Checkout + uses: actions/checkout@v2 + + - + name: Set up Docker Buildx + uses: docker/setup-buildx-action@v1 + + - id: repository_name + uses: ASzc/change-string-case-action@v1 + with: + string: ${{ github.repository }} + + - + name: Login to ghcr.io + uses: docker/login-action@v1 + with: + registry: ghcr.io + username: ${{ github.actor }} + password: ${{ secrets.GITHUB_TOKEN }} + + - + name: Build and push + id: docker_build + uses: docker/build-push-action@v2 + env: + IMAGE: ${{ steps.repository_name.outputs.lowercase }} + with: + push: true + tags: ghcr.io/${{ env.IMAGE }}:latest + context: . + file: ./docker/build.dockerfile + + - + name: Invoke deployment hook + uses: joelwmale/webhook-action@master + with: + url: ${{ secrets.WEBHOOK_URL }} diff --git a/docker/build.dockerfile b/docker/build.dockerfile new file mode 100644 index 0000000..5bfcb5d --- /dev/null +++ b/docker/build.dockerfile @@ -0,0 +1,38 @@ +FROM python:3.10-slim as build-image + +RUN apt-get update \ + && apt-get install --no-install-recommends -y gcc build-essential python3-dev libpq-dev libffi-dev \ + && rm -rf /var/lib/apt/lists/* + +WORKDIR /root/poetry +COPY pyproject.toml poetry.lock /root/poetry/ + +RUN pip install poetry --no-cache-dir \ + && poetry export --without-hashes > requirements.txt + +ENV VENV_PATH=/opt/venv + +RUN python -m venv $VENV_PATH \ + && . /opt/venv/bin/activate \ + && pip install -r requirements.txt --no-cache-dir + + +FROM python:3.10-slim as runtime-image + +RUN apt-get update \ + && apt-get install --no-install-recommends -y python3-dev libpq-dev libffi-dev \ + && rm -rf /var/lib/apt/lists/* + +WORKDIR /app + +COPY ./fastapi_book_server/ /app/ + +ENV VENV_PATH=/opt/venv +COPY --from=build-image $VENV_PATH $VENV_PATH +ENV PATH="$VENV_PATH/bin:$PATH" + +COPY ./scripts/start.sh /root/ + +EXPOSE 8080 + +CMD bash /root/start.sh diff --git a/scripts/start.sh b/scripts/start.sh new file mode 100644 index 0000000..4b02d41 --- /dev/null +++ b/scripts/start.sh @@ -0,0 +1,3 @@ +cd /app +alembic -c ./app/alembic.ini upgrade head +uvicorn main:app --host="0.0.0.0" --port="8080"