Pour le moment nous avons utilisé des images toutes faite, mais le principe de docker est d'utiliser ces images de base pour contruire votre application
Le principe est :
Il est possible d'apporter les modifications "a la main" via les commandes docker import & docker export , mais les fichier dockerfile sont justement concus pour ce genre de chose.
Nous allons créer une petite application en python dans un environement Python isolé (venv)
stef@tuto01:~$ python3 -m venv tutorial-env
stef@tuto01:~$ source tutorial-env/bin/activate
Structure des fichiers:
.
├── dockerfile
├── requirements.txt
└── src
└── main.py
Création du fichier requirements.txt, ce fichier permet de lister les paquets python nécessaire à l'application
mkdir -p ~/applis/src
Créer le fichier ~/applis/requirements.txt contenant
fastapi==0.121.1
uvicorn==0.38.0
Créer le fichier ~/applis/src/main.py contenant
# main.py
from fastapi import FastAPI
app = FastAPI()
@app.get("/")
async def root():
return {"greeting":"Hello world"}
if __name__ == "__main__":
import uvicorn
uvicorn.run(app, host="0.0.0.0", port=8000)
(tutorial-env) stef@tuto01:~$oui oui
(tutorial-env) stef@tuto01:~$ python3 applis/src/main.py
INFO: Started server process [21980]
INFO: Waiting for application startup.
INFO: Application startup complete.
INFO: Uvicorn running on http://0.0.0.0:8000 (Press CTRL+C to quit)
curl 127.0.0.1:8000
{"greeting":"Hello world"}stef@tuto01:~$
Nous avons donc un code fonctionnel sur le host
Nous allons decrire dans un fichier dockerfile les differentes actions que nous avons lister plus haut pour créer le programe
Fichier applis/dockerfile
FROM python:3.13
WORKDIR /applis
COPY requirements.txt .
RUN pip install -r requirements.txt && rm requirements.txt
COPY src .
EXPOSE 8000
ENTRYPOINT ["python", "main.py"]
stef@tuto01:~/applis$ docker build . -t applis
[+] Building 6.9s (10/10) FINISHED docker:default
=> [internal] load build definition from dockerfile 0.0s
=> => transferring dockerfile: 216B
0.0s
=> [internal] load metadata for docker.io/library/python:3.13 0.7s
=> [internal] load .dockerignore 0.0s
=> => transferring context: 2B 0.0s
=> [1/5] FROM docker.io/library/python:3.13@sha256:ba2cbe9b8e5f68fa2c7b4779bfa8f703d08872291f8ed525be949d705615ae10 0.0s
=> [internal] load build context 0.0s
=> => transferring context: 113B 0.0s
=> CACHED [2/5] WORKDIR /applis 0.0s
=> [3/5] COPY requirements.txt . 0.0s
=> [4/5] RUN pip install -r requirements.txt && rm requirements.txt 5.7s
=> [5/5] COPY src . 0.1s
=> exporting to image 0.2s
=> => exporting layers 0.2s
=> => writing image sha256:3a47fe458801c8d1be311410b381816ed7d2083017a59ac6b5681625aced5aed 0.0s
=> => naming to docker.io/library/applis
docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
applis latest 3a47fe458801 About a minute ago 1.14GB
docker history applis:latest
IMAGE CREATED CREATED BY SIZE COMMENT
3a47fe458801 About a minute ago ENTRYPOINT ["python" "main.py"] 0B buildkit.dockerfile.v0
<missing> About a minute ago EXPOSE [8000/tcp] 0B buildkit.dockerfile.v0
<missing> About a minute ago COPY src . # buildkit 224B buildkit.dockerfile.v0
<missing> About a minute ago RUN /bin/sh -c pip install -r requirements.t… 27.9MB buildkit.dockerfile.v0
<missing> About a minute ago COPY requirements.txt . # buildkit 16B buildkit.dockerfile.v0
<missing> 27 minutes ago WORKDIR /applis 0B buildkit.dockerfile.v0
<missing> 5 days ago CMD ["python3"] 0B buildkit.dockerfile.v0
<missing> 5 days ago RUN /bin/sh -c set -eux; for src in idle3 p… 36B buildkit.dockerfile.v0
<missing> 5 days ago RUN /bin/sh -c set -eux; wget -O python.ta… 70.3MB buildkit.dockerfile.v0
<missing> 5 days ago ENV PYTHON_SHA256=ed5ef34cda36cfa2f3a340f07c… 0B buildkit.dockerfile.v0
<missing> 5 days ago ENV PYTHON_VERSION=3.13.9 0B buildkit.dockerfile.v0
<missing> 5 days ago ENV GPG_KEY=7169605F62C751356D054A26A821E680… 0B buildkit.dockerfile.v0
<missing> 5 days ago RUN /bin/sh -c set -eux; apt-get update; a… 17.9MB buildkit.dockerfile.v0
<missing> 5 days ago ENV PATH=/usr/local/bin:/usr/local/sbin:/usr… 0B buildkit.dockerfile.v0
<missing> 5 days ago RUN /bin/sh -c set -ex; apt-get update; ap… 656MB buildkit.dockerfile.v0
<missing> 5 days ago RUN /bin/sh -c set -eux; apt-get update; a… 185MB buildkit.dockerfile.v0
<missing> 5 days ago RUN /bin/sh -c set -eux; apt-get update; a… 60.2MB buildkit.dockerfile.v0
<missing> 5 days ago # debian.sh --arch 'amd64' out/ 'trixie' '@1… 120MB debuerreotype 0.16
stef@tuto01:~/applis$
Test de l'application:
stef@tuto01:~/applis$ docker run -d --name firstapp -p 8080:8000 applis
stef@tuto01:~/applis$ curl 127.0.0.1:8080
{"greeting":"Hello world"}