Cum să creați imagini eficiente Python Docker

Cum să creați imagini eficiente Python Docker
Cititorii ca tine ajută la sprijinirea MUO. Când efectuați o achiziție folosind link-uri de pe site-ul nostru, este posibil să câștigăm un comision de afiliat. Citeşte mai mult.

Docker este software-ul standard al industriei pentru ambalarea și implementarea aplicațiilor în containere. Imaginile Docker sunt piatra de temelie pe care vă puteți construi și rula aplicațiile.





Pentru a debloca întregul potențial al Docker, trebuie să vă optimizați imaginile pentru eficiența resurselor, securitate și performanță. Acest lucru vă va asigura că aplicațiile dumneavoastră funcționează perfect în ecosistemul Docker.





Aflați cum să faceți acest lucru cu un exemplu din lumea reală care arată cum să containerizați o aplicație de calculator Python.





Începând cu o imagine de bază minimă

Unul dintre factorii care afectează eficiența unei imagini Docker este alegerea imaginii de bază. Ar trebui să începeți cu o imagine minimă care să includă doar componentele esențiale necesare pentru rularea aplicației dvs.

cum văd cine m-a blocat pe facebook

Imaginea pe care o utilizați ar trebui să provină și dintr-o sursă de renume care oferă actualizări de securitate și corecții. Ar trebui să aibă o comunitate activă și o documentare bună. Acest lucru este util atunci când depanați probleme sau când căutați asistență.



Pentru aplicația calculator, alegerea python:3.11-slim-bookworm , care este o imagine minimă, reduce dimensiunea imaginii. Acest lucru, la rândul său, minimizează consumul de resurse și accelerează descărcările și implementările de imagini.

# Starting With a Minimal Base Image 
FROM python:3.11-slim-bookworm AS builder

Puteți utilizați o imagine Alpine Linux și mai mică , optând pentru python:3.11-alpine. Cu toate acestea, această imagine nu include un interpret Python, un manager de pachete și biblioteci comune Python.





Rularea aplicațiilor ca utilizatori non-root

Rularea containerelor Docker ca utilizator root poate prezenta riscuri semnificative de securitate. Dacă un actor rău intenționat obține acces la un container care rulează ca root, acesta poate exploata vulnerabilitățile din software-ul containerului pentru a-și escalada privilegiile. Ei pot folosi apoi aceste privilegii pentru a executa comenzi cu control deplin asupra sistemului gazdă.

Soluția rulează aplicațiile dvs. ca a utilizator non-root . Exemplul de calculator creează și configurează utilizatorul calculator .





# Set non-root user for security 
RUN adduser calculator --system

# Add the user to the calculator group
RUN addgroup calculator && adduser calculator calculator

Crearea unui utilizator dedicat pentru aplicația dvs. limitează permisiunile disponibile pentru potențialii atacatori. Acest lucru face mai dificilă exploatarea vulnerabilităților.

Copierea fișierelor necesare și crearea unui mediu virtual

Crearea unui mediu virtual într-un container Docker izolează dependențele. Acest lucru previne conflictele cu pachetele la nivel de sistem și alte aplicații. De asemenea, asigură compatibilitatea versiunilor, deoarece puteți instala versiunile exacte de dependențe de care aplicația dvs. are nevoie, fără a afecta restul sistemului.

Copiați fișierele necesare în container. Apoi, creați un mediu virtual pentru aplicația calculator folosind Python încorporat venv modul.

# Set working directory and copy necessary files 
WORKDIR /app
COPY app.py .
COPY requirements.txt .
COPY config.json ./
# Copy config.json from the local directory

# Create a virtual environment and install dependencies
RUN python -m venv /venv
ENV PATH="/venv/bin:$PATH"
RUN /venv/bin/pip install --upgrade pip --no-cache-dir --requirement requirements.txt

Mediile virtuale sunt ușoare și eficiente, deoarece nu dublează pachetele la nivel de sistem. Acest lucru ajută la menținerea dimensiunii imaginii Docker mai mică și reduce consumul de resurse atunci când containerul rulează.

Minimizarea straturilor pentru eficiență

Fiecare instrucțiune dintr-un Dockerfile creează un nou strat în imaginea rezultată. Docker utilizează un mecanism de copiere la scriere pentru a gestiona aceste straturi. Reducerea numărului de straturi din imaginea Docker îmbunătățește semnificativ dimensiunea imaginii și performanța construcției. O modalitate de a reduce straturile este prin consolidarea mai multor comenzi într-o singură ALERGA instrucție.

# Minimizing Layers for Efficiency 
# Combine commands to reduce the number of layers
RUN echo "Build process goes here" && \
   /venv/bin/python -m compileall . && \
   rm -rf __pycache__

Combinarea comenzilor de mai sus reduce numărul de straturi intermediare create în timpul procesului de construire a imaginii.

Securizarea manipulării configurației

Manipularea informațiilor sensibile într-o imagine Docker prezintă un risc de securitate. Pentru a spori securitatea, ar trebui să utilizați variabile de mediu și fișiere de configurare externe. În exemplul aplicației calculatorului, puteți crea un director numit /config a depozita fișierul dvs. de configurare și stabiliți dreptul de proprietate corespunzătoare.

# Securing Configuration Handling 
RUN mkdir /config && chown calculator:calculator /config

Apoi copiați config.json fișier în acest director, asigurându-vă că rămâne separat de codul aplicației.

# Copy the config.json file into the container 
RUN cp config.json /config/config.json
ENV CONFIG_PATH=/config/config.json

Separarea datelor de configurare din cod și aplicarea permisiunilor adecvate îmbunătățește securitatea generală a imaginii dvs. Docker. Acesta asigură că numai procesele sau utilizatorii autorizați au acces la datele de configurare critice.

Utilizarea versiunilor în mai multe etape

Compilările în mai multe etape vă permit să separați mediul de construcție de imaginea finală. Acest lucru are ca rezultat imagini de producție mai mici și mai concentrate. De asemenea, îmbunătățește securitatea prin excluderea instrumentelor și fișierelor legate de construcție din imaginea finală. Acest lucru reduce suprafața de atac și minimizează riscurile potențiale de securitate asociate cu componentele inutile.

# Leveraging Multi-Stage Builds 
FROM python:3.11-slim-bookworm

COPY --from=builder /etc/passwd /etc/passwd
COPY --from=builder /etc/group /etc/group
COPY --from=builder /venv /venv
COPY --from=builder /config /config
COPY --from=builder /app /app
# Copy the application code

Codul de mai sus copiază doar artefactele necesare din etapa de construire (constructor) în imaginea finală. Acest lucru reduce dimensiunea imaginii prin excluderea instrumentelor și fișierelor legate de construcție care nu sunt necesare pentru rularea aplicației de calculator.

Îmbunătățirea securității prin scanarea imaginilor

Pentru a îmbunătăți și mai mult securitatea imaginilor dvs. Docker, utilizați instrumente de scanare a imaginilor precum Trivy sau Clair. Aceste instrumente sunt concepute pentru a identifica vulnerabilitățile din straturile și dependențele dvs. de imagine. Utilizați Trivy pentru aplicația pentru calculator efectuează scanarea vulnerabilităților .

# Install Trivy for Debian/Ubuntu 
RUN apt-get update && \
   apt-get install -y wget apt-transport-https gnupg lsb-release && \
   wget -qO - https://aquasecurity.github.io/trivy-repo/deb/public.key | apt-key add - && \
   echo "deb https://aquasecurity.github.io/trivy-repo/deb bookworm main" \
   | tee -a /etc/apt/sources.list.d/trivy.list && \
   apt-get update && \
   apt-get install -y trivy

Adăugarea scanării vulnerabilităților Trivy la imaginea dvs. Docker este crucială. Acest lucru se datorează faptului că utilizează baza de date Common Vulnerabilities and Exposures (CVE), care este actualizată în mod regulat cu informații despre vulnerabilități cunoscute. Acest lucru vă ajută să vă mențineți imaginile la zi cu cele mai recente corecții de securitate și să vă protejați aplicațiile de exploatările cunoscute.

Pentru a obține un raport de vulnerabilitate asupra imaginii dvs., utilizați următoarea comandă.

de ce imessage nu spune livrat
docker run --rm ` 
 -v /var/run/docker.sock:/var/run/docker.sock `
 -v $HOME/Library/Caches:/root/.cache/ `
 aquasec/trivy:0.18.3 `
 <your image name>

Rularea comenzii de mai sus va dura ceva timp. Odată ce este terminat, va genera un raport ca cel de mai jos.

  Raport de vulnerabilitate Trivy pe terminal

Cu cât gravitatea este mai mare, cu atât mai repede ar trebui să abordați vulnerabilitatea identificată.

Rularea aplicațiilor ca utilizatori non-root

Pentru a spori securitatea, rulați aplicația ca calculato utilizator pentru a limita potențialele vulnerabilități.

# Running Applications as Non-Root Users 
WORKDIR /app
USER calculator

# Activate the virtual environment and run the application
CMD ["/bin/bash", "-c", "source /venv/bin/activate && python app.py"]

Trecerea la un utilizator non-root minimizează suprafața de atac.

Containerizarea aplicațiilor non-Python

Containerizarea Docker a aplicațiilor alimentate de alte limbi este puțin diferită. Ar trebui să vă familiarizați cu modul de containerizare a diferitelor tipuri de aplicații. Acest lucru vă va ajuta să decideți cea mai bună strategie de adoptat în funcție de tipul de limbă pe care o folosește aplicația dvs.