Add comments
This commit is contained in:
5
api-server-multistage/.dockerignore
Normal file
5
api-server-multistage/.dockerignore
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
**/.env/
|
||||||
|
**/__pycache__/
|
||||||
|
**/Makefile
|
||||||
|
**/Dockerfile
|
||||||
|
*.log
|
||||||
25
api-server-multistage/Dockerfile
Normal file
25
api-server-multistage/Dockerfile
Normal file
@ -0,0 +1,25 @@
|
|||||||
|
FROM python:3.11-slim-bookworm
|
||||||
|
|
||||||
|
# set virtual env path
|
||||||
|
ENV \
|
||||||
|
PATH=/venv/bin:$PATH
|
||||||
|
|
||||||
|
# does nothing, for documentation only
|
||||||
|
EXPOSE 3000
|
||||||
|
|
||||||
|
# create and set main app directory
|
||||||
|
WORKDIR /app
|
||||||
|
|
||||||
|
# copy app files to /app directory
|
||||||
|
COPY ./app .
|
||||||
|
|
||||||
|
# install dependencies
|
||||||
|
RUN \
|
||||||
|
python -m venv /venv && \
|
||||||
|
pip install -r requirements.txt
|
||||||
|
|
||||||
|
# start shell script when container starts
|
||||||
|
ENTRYPOINT ["/app/run.sh"]
|
||||||
|
|
||||||
|
# no additional parameters to run.sh script
|
||||||
|
CMD []
|
||||||
32
api-server-multistage/Makefile
Normal file
32
api-server-multistage/Makefile
Normal file
@ -0,0 +1,32 @@
|
|||||||
|
IMAGE_NAME=api-server
|
||||||
|
CONTAINER_NAME=api-server
|
||||||
|
|
||||||
|
build: clean
|
||||||
|
@docker build \
|
||||||
|
--progress=plain \
|
||||||
|
--no-cache \
|
||||||
|
--tag $(IMAGE_NAME) \
|
||||||
|
.
|
||||||
|
|
||||||
|
run:
|
||||||
|
@docker run \
|
||||||
|
--name $(IMAGE_NAME) \
|
||||||
|
--publish 3000:3000 \
|
||||||
|
--env CONTAINER_NAME="Awesome API server" \
|
||||||
|
--detach \
|
||||||
|
$(CONTAINER_NAME)
|
||||||
|
|
||||||
|
run-mount-log:
|
||||||
|
@docker run \
|
||||||
|
--name $(IMAGE_NAME) \
|
||||||
|
--publish 3000:3000 \
|
||||||
|
--volume /var/log/api-server:/app/log \
|
||||||
|
--env CONTAINER_NAME="Awesome API server" \
|
||||||
|
--detach \
|
||||||
|
$(CONTAINER_NAME)
|
||||||
|
|
||||||
|
|
||||||
|
clean:
|
||||||
|
- @docker stop $(CONTAINER_NAME)
|
||||||
|
- @docker rm $(CONTAINER_NAME)
|
||||||
|
- @docker rmi $(IMAGE_NAME)
|
||||||
2
api-server-multistage/app/Makefile
Normal file
2
api-server-multistage/app/Makefile
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
run:
|
||||||
|
@./run.sh
|
||||||
29
api-server-multistage/app/main.py
Normal file
29
api-server-multistage/app/main.py
Normal file
@ -0,0 +1,29 @@
|
|||||||
|
from fastapi import FastAPI
|
||||||
|
import logging
|
||||||
|
import os
|
||||||
|
|
||||||
|
app = FastAPI()
|
||||||
|
|
||||||
|
|
||||||
|
LOG_FILE = "./log/api-server.log"
|
||||||
|
CONTAINER_NAME = os.environ.get("CONTAINER_NAME", "Unknown")
|
||||||
|
|
||||||
|
|
||||||
|
@app.get("/")
|
||||||
|
async def root():
|
||||||
|
logging.info(f"Container {CONTAINER_NAME} received request")
|
||||||
|
return {
|
||||||
|
"message": f"Hello World from {CONTAINER_NAME}",
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
def main():
|
||||||
|
logging.basicConfig(
|
||||||
|
filename=LOG_FILE,
|
||||||
|
format="%(asctime)s %(levelname)s %(message)s",
|
||||||
|
level=logging.INFO,
|
||||||
|
)
|
||||||
|
logging.info(f"Starting server {CONTAINER_NAME}")
|
||||||
|
|
||||||
|
|
||||||
|
main()
|
||||||
2
api-server-multistage/app/requirements.txt
Normal file
2
api-server-multistage/app/requirements.txt
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
fastapi
|
||||||
|
uvicorn
|
||||||
9
api-server-multistage/app/run.sh
Executable file
9
api-server-multistage/app/run.sh
Executable file
@ -0,0 +1,9 @@
|
|||||||
|
#!/usr/bin/sh
|
||||||
|
|
||||||
|
# start command with exec to replace execution shell and properly receive signals from docker
|
||||||
|
# without exec, container can't be gracefully terminated with ctrl+c or docker stop
|
||||||
|
exec uvicorn \
|
||||||
|
main:app \
|
||||||
|
--host 0.0.0.0 \
|
||||||
|
--port 3000 \
|
||||||
|
--lifespan off
|
||||||
@ -1,14 +1,19 @@
|
|||||||
FROM python:3.11-slim-bookworm
|
FROM python:3.11-slim-bookworm
|
||||||
|
|
||||||
|
# set virtual env path
|
||||||
ENV \
|
ENV \
|
||||||
PATH=/venv/bin:$PATH
|
PATH=/venv/bin:$PATH
|
||||||
|
|
||||||
|
# does nothing, for documentation only
|
||||||
EXPOSE 3000
|
EXPOSE 3000
|
||||||
|
|
||||||
|
# create and set main app directory
|
||||||
WORKDIR /app
|
WORKDIR /app
|
||||||
|
|
||||||
|
# copy app files to /app directory
|
||||||
COPY ./app .
|
COPY ./app .
|
||||||
|
|
||||||
|
# install dependencies
|
||||||
RUN \
|
RUN \
|
||||||
python -m venv /venv && \
|
python -m venv /venv && \
|
||||||
pip install -r requirements.txt
|
pip install -r requirements.txt
|
||||||
|
|||||||
Reference in New Issue
Block a user