Quiz
Les questions font référence à un fichier Python « app.py », un « dockerfile » et le fichier « docker-compose ».
Fichier « app.py » :
import time
import redis
from flask import Flask
app = Flask(__name__)
cache = redis.Redis(host='redis', port=6379)
def get_hit_count():
retries = 5
while True:
try:
return cache.incr('hits')
except redis.exceptions.ConnectionError as exc:
if retries == 0:
raise exc
retries -= 1
time.sleep(0.5)
@app.route('/')
def hello():
count = get_hit_count()
return 'Bonjour studi! j’ai été incrémenté {} fois.\n'.format(count
import time import redis from flask import Flask app = Flask(__name__) cache = redis.Redis(host='redis', port=6379) def get_hit_count(): retries = 5 while True: try: return cache.incr('hits') except redis.exceptions.ConnectionError as exc: if retries == 0: raise exc retries -= 1 time.sleep(0.5) @app.route('/') def hello(): count = get_hit_count() return 'Bonjour studi! j’ai été incrémenté {} fois.\n'.format(count
« dockerfile » :
FROM python:3.7-alpine
WORKDIR /code
ENV FLASK_APP=app.py
ENV FLASK_RUN_HOST=0.0.0.0
RUN apk add --no-cache gcc musl-dev linux-headers
COPY requirements.txt requirements.txt
RUN pip install -r requirements.txt
EXPOSE 5000
COPY . .
CMD ["flask", "run"]
FROM python:3.7-alpine WORKDIR /code ENV FLASK_APP=app.py ENV FLASK_RUN_HOST=0.0.0.0 RUN apk add --no-cache gcc musl-dev linux-headers COPY requirements.txt requirements.txt RUN pip install -r requirements.txt EXPOSE 5000 COPY . . CMD ["flask", "run"]
Fichier « docker-compose » :
version: "3.9"
services:
web:
build: .
ports:
- "8000:5000"
redis:
image: "redis:alpine"
version: "3.9" services: web: build: . ports: - "8000:5000" redis: image: "redis:alpine"
Question 1
Le fichier « requirements » est un fichier qui doit être placé dans le répertoire courant lorsque vous exécutez la commande Docker Compose.
Correction
Le « dockerfile » en réalise une copie, du répertoire courant vers le container.
Question 2
Dans cette configuration, « build : . » signifie « construit l’image si le « dockerfile » n’existe pas ».
Correction
L’image docker construit l’image en utilisant le répertoire courant où se trouve le « dockerfile ».
Question 3
Dans cette configuration, l’image « redis » est récupérée du « Docker Hub ».
Correction
L’image « redis » est dépourvue de « dockerfile » dans ce cas, c’est d’ailleurs pourquoi on voit le mot-clé « images ». L’image est téléchargée depuis le registre Docker.
Question 4
L’application Flask, bien que non spécifiée expressément, va utiliser le port 5000.
Correction
Le mot clé « EXPOSE » signifie que le port 5000 sera exposé. De plus, l'application Flask tourne souvent sur ce port par défaut. D’après le fichier « docker-compose », on observe un mapping de port : « hôte (8000) -container (5000) ».
Question 5
Dans l’application Flask, la ligne « cache = redis.Redis(host='redis', port=6379) » ne renseigne pas une adresse IP pour l’hôte. C'est une erreur.
Correction
Dans Docker Compose, les services sont nommés. Il se crée un réseau interne à Docker Compose où chacun des services a un identifiant. Dans ce cas, le service « redis » est appelé « : ‘redis’ ! ».