Comme on a pu le voir précédemment la commande pour build une image est docker image build ou docker build. Cette commande peut prendre plusieurs paramètres, en voici quelques uns :
Paramètres | Utilité |
---|---|
-f, --file | Spécifier le dockerfile |
--force-rm | Supprime les containers intermédiaire |
--label | Ajoute des metadata à l'image |
--rm | Supprime les containers intermédiaire uniquement si le build se termine avec succès |
--ulimit | Limiter l'utilisation des ressources du système |
Pour build une image on utilise la commande suivante :
$ docker image build . -t <NAME>:<TAG>
On peut aussi build via le STDIN :
$ docker image build -t test:stdin --rm -<<EOF
> FROM nginx:latest
> RUN echo "test"
> EOF
Il y a 3 méthodes pour build une image en utilisant un URL :
docker image build -t <NAME>:<TAG> <GIT_URL>#<REF>
docker image build -t <NAME>:<TAG> <GIT_URL>#:<DIRECTORY>
docker image build -t <NAME>:<TAG> <GIT_URL>#<REF>:<DIRECTORY>
Il est possible de construire une image depuis une archive tar. Pour se faire, il faut évidemment qu'un dockerfile soit présent dans l'archive puis exécuter la commande suivante :
docker image build -t <NAME>:<TAG> - < <FILE>.tar.gz
Lorsque l'on construit une image docker il faut optimiser la taille de celle-ci. Le multi-stage building va nous permettre de créer une image à partir de plusieurs images et de ne récupérer que ce qui nous intéresse dans l'image X pour la mettre dans l'image Y :
Voici un exemple pour une application node js :
FROM node AS build # Etape build
RUN mkdir -p /var/node/
ADD src/ /var/node/
WORKDIR /var/node
RUN npm install
FROM node:alpine
ARG VERSION=V1.1
LABEL org.label-schema.version=$VERSION
ENV NODE_ENV="production"
COPY --from=build /var/node /var/node # On copie les fichiers /var/node depuis l'étape build
WORKDIR /var/node
EXPOSE 3000
ENTRYPOINT ["./bin/www"]
Afin d'associer une image à une version ou à un commit GIT nous allons taguer l'image.
Nous le faisons déjà lors du build de l'image via le paramètre -t mais nous pouvons retaguer une image via la commande suivante :
docker image tag <IMAGE_SOURCE>:<TAG> <IMAGE_DEST>:<TAG>
On peut par exemple taguer une image via le hash du commit git en utilisant la commande suivante :
git log -1 --pretty=%H
Pour se faire il faut avoir un compte sur Docker Hub
Ensuite, nous allons taguer l'image via la commande suivante :
docker image tag <NOM_IMAGE>:<TAG> <USERNAME>/<NOM_IMAGE>:<TAG>
Puis nous allons push l'image sur le docker hub :
docker login # Permet de se log au docker hub
docker image push <USERNAME>/<NOM_IMAGE>:<TAG>
Nous pouvons consulter l'historique d'une image via la commande docker image history :
$ docker image history nginx
IMAGE CREATED CREATED BY SIZE COMMENT
4f380adfc10f 4 days ago /bin/sh -c #(nop) CMD ["nginx" "-g" "daemon… 0B
<missing> 4 days ago /bin/sh -c #(nop) STOPSIGNAL SIGQUIT 0B
<missing> 4 days ago /bin/sh -c #(nop) EXPOSE 80 0B
<missing> 4 days ago /bin/sh -c #(nop) ENTRYPOINT ["/docker-entr… 0B
<missing> 4 days ago /bin/sh -c #(nop) COPY file:09a214a3e07c919a… 4.61kB
<missing> 4 days ago /bin/sh -c #(nop) COPY file:0fd5fca330dcd6a7… 1.04kB
<missing> 4 days ago /bin/sh -c #(nop) COPY file:0b866ff3fc1ef5b0… 1.96kB
<missing> 4 days ago /bin/sh -c #(nop) COPY file:65504f71f5855ca0… 1.2kB
<missing> 4 days ago /bin/sh -c set -x && addgroup --system -… 63.9MB
...
A savoir que l'ID 4f380adfc10f (première ligne) est en fait le hash de l'image actuel :
$ docker image ls | grep 4f380adfc10f
nginx latest 4f380adfc10f 4 days ago 133MB
Chaque ligne correspond à une instruction du dockerfile nginx.
Pour voir le "CREATED BY" sans truncate il faut utiliser la commmande suivante :
$ docker image history --no-trunc nginx
# On peut aussi lister QUE le hash de l'étape via la commande
$ docker image history --quiet nginx
Afin de sauvegarder une image dans une archive tar, voici 3 exemples :
docker image save <IMAGE> > <FILE>.tar
docker image save <IMAGE> -o <FILE>.tar
docker image save <IMAGE> --output <FILE>.tar
Afin de restaurer une image nous pouvons faire :
docker image load < <FILE>.tar
docker image load -i <FILE>.tar
docker image load --input <FILE>.tar