28. July 2021
FastAPI | Tutorial mit Docker und Visual Studio Code/DevContainer
TL;DR
Das Repository zu diesem Blog finden sie hier.
Voraussetzung
Für die Durchführung dieses Tutorials benötigen Sie Visual Studio Code, sowie Docker.
Docker
Installieren Sie Docker, indem Sie die Anwendung Docker Desktop herunterladen. Sie finden den Download hier: https://www.docker.com/products/docker-desktop
Visual Studio Code
Installieren Sie Visual Studio Code mit Hilfe des Zip-Archiv. Sie können es von hier herunterladen: https://code.visualstudio.com/#alt-downloads
Hinweis: https://code.visualstudio.com, danach den Link Other platforms
Im Programmverzeichnis von Visual Studio Code erstellen Sie den Order data
.
- Windows Subsystem for Linux (WLS) (
ms-vscode-remote.remote-ws
l) - Remote Containers (
ms-vscode-remote.remote-containers
) - Docker (
ms-azuretools.vscode-docker
) - Python (
ms-python.python
)
Umgebung für unser Tutorial
Wir wollen alle in diesem Tutorials verwendeten Dateien in einem eigenen Ordner ablegen, z. B. FastAPI-Tutorial
Am Ende des Tutorials hat der Ordner diesen Inhalt
Visual Studio Code Remote Containers arbeiten mit Hilfe von Docker, um eine virtuelle Umgebung bereitzustellen.
Hierfür benötigen wie eine Reihe von Docker Konfigurationsdateien
Dockerfile
<pre class="EnlighterJSRAW" data-enlighter-group="" data-enlighter-highlight="" data-enlighter-language="generic" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-theme="" data-enlighter-title="">FROM ubuntu:21.04
LABEL MAINTAINER="Ralph Göstenmeier"
# set environment variables
ENV TZ 'Europe/Berlin'
RUN apt-get update
RUN echo $TZ > /etc/timezone
RUN apt-get install -y tzdata \
&& rm /etc/localtime \
&& ln -snf /usr/share/zoneinfo/$TZ /etc/localtime \
&& dpkg-reconfigure -f noninteractive tzdata \
&& apt-get clean
RUN apt-get install --yes build-essential lsb-release curl sudo git vim
RUN apt-get install --yes python3-pip python3-venv
RUN groupadd work -g 1000
RUN adduser user --uid 1000 --gid 1000 --home /home/user --disabled-password --gecos User
RUN echo '%work ALL=(ALL) NOPASSWD: ALL' >/etc/sudoers.d/work
EXPOSE 5000
ENV PYTHONDONTWRITEBYTECODE 1
ENV PYTHONUNBUFFERED 1
#
USER user
VOLUME [ "/workspace" ]
COPY requirements.txt /workspace/requirements.txt
WORKDIR /workspace
RUN pip install -r requirements.txt
CMD ["bash", "-l"]
docker-compose.yml
<pre class="EnlighterJSRAW" data-enlighter-group="" data-enlighter-highlight="" data-enlighter-language="generic" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-theme="" data-enlighter-title="">version: "3.8"
services:
app:
build:
context: .
dockerfile: Dockerfile
container_name: fastapi-tutorial
volumes:
- ./workspace:/workspace
ports:
- 5000:5000
environment:
- FASTAPI_ENV=development
command: /bin/sh -c "while sleep 1000; do :; done"
requirements.txt
Für unsere Beispielanwendung benötigen wir eine Reihe von Python-Paketen. Diese werden mit Hilfe der Datei requirements.txt
beim Bauen des Docker Images installiert.
<pre class="EnlighterJSRAW" data-enlighter-group="" data-enlighter-highlight="" data-enlighter-language="generic" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-theme="" data-enlighter-title="">asgiref==3.4.1
certifi==2021.5.30
charset-normalizer==2.0.3
click==8.0.1
fastapi==0.67.0
h11==0.12.0
idna==3.2
pydantic==1.8.2
requests==2.26.0
starlette==0.14.2
typing-extensions==3.10.0.0
urllib3==1.26.6
uvicorn==0.14.0
Visual Studio Code Umgebung
Verzeichnisstruktur
Die aktuelle Verzeichnisstruktur beinhaltet 2 Dateien.
Wir wollen nun diese Ordner in einem Container öffnen.
Klicken Sie hierzu in der Statusleiste links unten auf das grüne Symbol (Open a Remote Window)
Visual Studio Code hat nun den Container geöffnet und Sie befinden sich innerhalb des Docker Image.
Tritt beim Erstellen der Umgebung ein Fehler auf, dann kann es an den Einstellungen in der Datei docker-compose.yml
liegen
Schließen Sie das Fenster und öffnen sie den Ordner wieder lokal.
Ändern se den Namen des Servier von your-service-name-here
nach app
.
Dieses Docker Image würde basierend auf der Linux Distribution Ubuntu erstellt.
Erkunden Sie einfach mal die Umgebung.
Als nächstes passen wir die Umgebung des DevContainer an. Wir wollen z. B. nur die Dateien unserer Anwendung sehen und nicht die Docker Konfigurationsdateien
Hierzu erstellen wir einen Unterordner workspace
und legen diesen als Startverzeichnis fest.
.devcontainer/devcontainer.json
<pre class="EnlighterJSRAW" data-enlighter-group="" data-enlighter-highlight="11" data-enlighter-language="json" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-theme="" data-enlighter-title="">{
"name": "FastAPI Tutorial",
"dockerComposeFile": [
"../docker-compose.yml",
"docker-compose.yml"
],
"service": "app",
"workspaceFolder": "/workspace",
"settings": {},
"extensions": []
}
.devcontainer/docker-compose.yml
<pre class="EnlighterJSRAW" data-enlighter-group="" data-enlighter-highlight="6" data-enlighter-language="yaml" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-theme="" data-enlighter-title="">version: '3.8'
services:
app:
volumes:
- ./workspace:/workspace:cached
command: /bin/sh -c "while sleep 1000; do :; done"
Arbeitsordner erstellen
<pre class="EnlighterJSRAW" data-enlighter-group="" data-enlighter-highlight="" data-enlighter-language="generic" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-theme="" data-enlighter-title="">mkdir workspace
Container neu erstellen
Da wir ein neuen workspaceFolder eingestellt haben, ist das Startverzeichnis in Visual Studio Code leer:
Basisdatei für die Anwendung erstellen
Verwenden Sie dann den nachfolgende Code für die Datei
<pre class="EnlighterJSRAW" data-enlighter-group="" data-enlighter-highlight="" data-enlighter-language="python" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-theme="" data-enlighter-title="">from fastapi import FastAPI
app =FastAPI()
@app.get('/')
def home():
return { 'name': 'FastAPI Tutorial' }
<pre class="EnlighterJSRAW" data-enlighter-group="" data-enlighter-highlight="" data-enlighter-language="generic" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-theme="" data-enlighter-title="">uvicorn main:app --reload --port 5000 --host 0.0.0.0