Pythonmiljö i Docker
Ett vanligt användningsområde för Docker är att skapa och köra virtuella Pythonmiljöer. Med en Dockerfile och Docker Compose kan vi automatisera hela processen, från skapandet av miljön till exekveringen.
Bild: Volker Lekies
Som exempelprogram kommer vi att göra ett litet Pythonprogram som hämtar aktuell temperatur för Ängelholm via SMHIs öppna API. Temperaturen, tillsammans med aktuell tidsstämpel, kommer att skrivas ut på skärmen. Programmet körs i en loop och hämtar ny temperatur var femte minut.
Utdata från programmet kommer att se ut så här:
Temperatur i Ängelholm (2022-07-24 17:00:00): 20.4C
Förberedelser
För detta projektet behöver du docker compose
på din dator. Använder du
Debian eller Ubuntu installerar du det med apt install
docker-compose-plugin
. Använder du Fedora, Red Hat eller CentOS använder du
dnf install docker-compose-plugin
. Detta förutsätter att du använder dig av
Dockers officiella paketförråd.
När du har installerat Docker Compose är det dags att skapa en ny katalog för projektet och gå in i den. Jag döper min katalog till temperatur:
$> mkdir temperatur
$> cd temperatur
Vi behöver också skapa en katalog för koden:
$> pwd
/home/jake/temperatur
$> mkdir kod
Pythonprogrammet
I kod-katalogen skapar vi nu Pythonprogrammet för att hämta temperaturen. Filnamnet ska vara temperatur.py.
~/temperatur/kod/temperatur.py
import requests
import time
import datetime
url = "http://opendata-download-metobs.smhi.se/api/version/1.0/parameter/1/station/62180/period/latest-hour/data.json"
while True:
data = requests.get(url).json()
timestamp = data['updated'] / 1000 # SMHIs tidstämpel är i millisekunder
humandate = datetime.datetime.fromtimestamp(timestamp)
print("Temperatur i Ängelholm (" + str(humandate) + "):", data['value'][0]['value'] + "C")
time.sleep(300)
Därefter skapar vi en requirements.txt. I denna lägger vi de moduler vi
behöver installera i den virtuella Pythonmiljön. I vårt fall är det bara
requests
:
~/temperatur/kod/requirements.txt
requests
Dockerfilerna
I temperatur-katalogen skapar vi nu de två Dockerfilerna, Dockerfile och docker-compose.yml. Filen Dockerfile används för att bygga Docker-avbilden, och docker-compose.yml används för att initiera bygget av avbilden samt för att starta och stoppa containern.
~/temperatur/Dockerfile
FROM debian:stable-slim
RUN apt-get update && apt-get install -y python3 python3-venv tzdata
# Skapa inte __pycache__
ENV PYTHONDONTWRITEBYTECODE 1
ENV PYTHONUNBUFFERED 1
## Sätt svensk tidszon
ENV TZ="Europe/Stockholm"
# Pythonmiljön
ENV VIRTUAL_ENV=/opt/venv
# Sätt upp Pythonmiljön
RUN python3 -m venv $VIRTUAL_ENV
ENV PATH="$VIRTUAL_ENV/bin:$PATH"
# Kopiera koden
RUN mkdir /kod
COPY kod/requirements.txt /kod
COPY kod/temperatur.py /kod
RUN pip install -r /kod/requirements.txt
# Kör programmet
WORKDIR /kod
CMD ["python", "temperatur.py"]
~/temperatur/docker-compose.yml
version: "3.8"
services:
temperatur:
restart: unless-stopped
build: .
Starta stacken
Nu kan vi starta hela miljön, eller stacken som det också kallas, med docker
compose up
. När vi kör detta kommer avbilden att byggas. I avbilden kommer en
virtuell Pythonmiljö att skapas som innehåller de moduler som behövs. Här sätts
även sökvägen till Pythontolkaren (till den i den virtuella Pythonmiljön) och
programmet som ska köras. När bygget är klart startas en container av avbilden.
$> pwd
/home/jake/temperatur
$> docker compose up
[+] Building 21.8s (13/13) FINISHED
=> [internal] load build definition from Dockerfile 0.1s
=> => transferring dockerfile: 595B 0.0s
=> [internal] load .dockerignore 0.1s
=> => transferring context: 2B 0.0s
=> [internal] load metadata for docker.io/library/debian:stable-slim 1.0s
=> CACHED [1/8] FROM docker.io/library/debian:stable-slim@sha256:4e67 0.0s
=> [internal] load build context 0.1s
=> => transferring context: 597B 0.0s
=> [2/8] RUN apt-get update && apt-get install -y python3 python3-venv 12.9s
=> [3/8] RUN python3 -m venv /opt/venv 2.8s
=> [4/8] RUN mkdir /kod 0.5s
=> [5/8] COPY kod/requirements.txt /kod 0.1s
=> [6/8] COPY kod/temperatur.py /kod 0.1s
=> [7/8] RUN pip install -r /kod/requirements.txt 3.1s
=> [8/8] WORKDIR /kod 0.1s
=> exporting to image 0.7s
=> => exporting layers 0.7s
=> => writing image sha256:9490d40b43e99e212a85e8121524716f76c6d069a25b 0.0s
=> => naming to docker.io/library/temperatur_temperatur 0.0s
Use 'docker scan' to run Snyk tests against images to find vulnerabilities
and learn how to fix them
[+] Running 2/2
⠿ Network temperatur_default Created 0.1s
⠿ Container temperatur-temperatur-1 Created 0.1s
Attaching to temperatur-temperatur-1
temperatur-temperatur-1 | Temperatur i Ängelholm (2022-07-24 18:00:00): 20.0C
Var femte minut kommer en ny rad med aktuell temperatur att skrivas ut från containern. Den temperatur vi hämtar från SMHI uppdateras dock bara en gång per timme, men för att demonstrera hämtar vi den var femte minut.
För att stoppa miljön, tryck CTRL+C.
Demonstration
Kommentarer
Kommentarsfältet är modererat. Det innebär att alla kommentarer granskas av ansvarig utgivare före publicering.
Du väljer själv om du vill ange ditt riktiga namn, en pseudonym eller vara helt anonym. Ingen registrering behövs.
Relaterade artiklar
-
Ny utgåva av Docker från grunden
Docker från grunden utkommit i en ny utgåva. Den största skillnaden är uppdateringen till Docker Compose version 2. Även andra mindre uppdateringar har gjorts för att hålla boken aktuell.
-
Det nya Docker Compose
Sedan i mitten av förra året har det gamla Python-baserade
docker-compose
-kommandot sakta ersatts av det nyare Go-baseradedocker compose
. Det nya kommandot är ett plugin till Docker istället för ett fristående kommando som tidigare. -
Docker Desktop för Linux är här
Nu finns Docker Desktop även för Linux. Precis som Docker Desktop för macOS och Windows, finns även Kubernetes inkluderat i Linux-versionen. Man använder även ett VM för att köra containrarna.
-
Drifta din egen molnlagring med Seafile
Seafile är ett program med öppen källkod för att synkronisera och lagra filer. Det kan liknas med ett privat Dropbox. Seafile har både en webbklient och klienter för Linux, Windows, macOS, Android och iPad/iPhone.
Senaste nyheterna och inläggen
-
Ny utgåva av Docker från grunden
Docker från grunden utkommit i en ny utgåva. Den största skillnaden är uppdateringen till Docker Compose version 2. Även andra mindre uppdateringar har gjorts för att hålla boken aktuell.
-
PGP-krypterat formulär
Jag blev inspirerad av Tutanotas Secure Connect – ett säkert webbformulär som skickar uppgifterna krypterat direkt till inkorgen. Skulle det inte gå att bygga något liknande med PGP? Det gick, och det var dessutom förvånansvärt enkelt då det redan finns ett GnuPG-bibliotek för PHP.
-
Var försiktig med att curl:a skript som root
Att installera program i Linux genom att omdirigera utdata från Curl till skalet är snabbt och smidigt. Men det är ack så farligt om du inte känner till programmet eller dess ursprung.
-
DOSBox för att programmera gamla personsökare
DOSBox kan användas till betydligt mer än bara gamla spel. Ett intressant användningsområde är att kunna använda gamla DOS-program för att programmera diverse enheter över serieporten. Oftast behövs inte ens en serieport, istället går det att använda en USB-serieportsadapter.
-
GDPR som ett stöd, inte ett hinder
Företag, föreningar och kommuner borde se GDPR som ett stöd och en vägledning, inte ett hinder. Trots det är det många som väntar ut Schrems II-domens efterspel för att inte behöva göra något. Andra försöker komma runt GDPR på olika sätt. Men man får glömma inte bort vem GDPR ska skydda – organisationens viktigaste tillgångar; kunderna, medlemmarna och invånarna.
Utvalda artiklar
-
Poliser satte dit oskyldig
Två poliser dömdes i juni till vardera ett års fängelse av Lunds tingsrätt för att ha misshandlat och gripit en oskyldig man i hans bostad i Landskrona. Händelsen ägde rum en natt i mars förra året och spelades in av en övervakningskamera i mannens bostad.
-
Retroloppis i Påarp
Idag var det retroloppis hos Andreas Nilsson i Påarp. På baksidan av huset fanns hundratals spel uppradade på långa bord. Trots friska vindar och sval temperatur var loppisen välbesökt.
-
Stort deltagande på årets Gubbdata
I helgen var det Gubbdata i Lund – ett av Sveriges största demoparty. På plats fanns cirka ett hundra deltagare, alla med en passion för retrodatorer.
-
Kapad identitet
I mitten av september förra året blev Kristina utsatt för ett id-kapningsförsök. Någon hade ansökt om ett lån på 250 000 kr i hennes namn. Låneansökan gick ut till ett 20-tal banker.
-
Amiga-scenen lever än
I en villa mellan Ljungskile och Stenungsund den 27 november träffades de igen, ett gäng glada Amiga-entusiaster. Man träffas för att prata, titta på demos, spela och ha allmänt trevligt.
CyberInfo Sverige är ett IT- och medieföretag i nordvästra Skåne som tillhandahåller böcker, utbildningar, nyheter och konsulttjänster inom Linux, säkerhet och programmering.
CyberInfo Sverige är godkänd för F-skatt, är momsregistrerat och innehar
utgivningsbevis för webbplatsen www.cyberinfo.se.