# Docker Hub

Nous allons maintenant construire une image Docker à partir de notre code source.

Nous allons le faire *en dehors* de notre DevContainer :

* si vous êtes sous Windows, ouvrez un nouveau PowerShell
* si vous êtes sous MacOS ou Linux, ouvrez un nouveau Terminal

Naviguez dans le dossier du projet.

## Instructions

Jetez un coup d'œil au fichier `./config/docker/Dockerfile.prod` :

```dockerfile
FROM node:20-alpine AS api-builder
WORKDIR /app
COPY . .
RUN npm install
RUN npm run clean
RUN npm run build

FROM node:20-alpine AS api
WORKDIR /app
COPY --from=api-builder /app/build ./
COPY package* ./
RUN npm install --omit=dev
CMD ["npm", "run", "start-api"]
```

Voici la recette pour construire une image docker avec notre projet.

La construction se déroule en deux phases. Dans la première phase, nous *construisons* le projet :

1. Télécharger une image existante `node:20-alpine`
2. Copier tous les fichiers du répertoire courant dans l'image
3. Installer toutes les dépendances
4. Lancer un build (transpiler le typecript en javascript)

Dans la deuxième phase, nous construisons une image propre avec seulement le strict minimum requis pour faire fonctionner notre API. Nous ne copions que le résultat de la compilation (javascript transpilé) mais pas les sources du script de type, par exemple.

## Build

Pour construire l'image, nous exécutons la commande suivante :

```sh
docker buildx build --platform linux/amd64,linux/arm64  -t devops_api_prod -f ./config/docker/Dockerfile.prod .
```

Si vous êtes sur Windows et une architecture 64-bit, vous pouvez aussi simplement mettre :

```sh
docker build -t devops_api_prod -f ./config/docker/Dockerfile.prod .
```

L'image est construite, et on peut le voir avec la commande :

```sh
docker image ls
```

## Dépôt externe : Docker Hub

Nous allons maintenant télécharger cette image dans le dépôt Docker Hub, ou notre serveur, ou notre infrastructure, pourra la télécharger et démarrer le conteneur.

[Docker Hub](https://hub.docker.com)

Créez un nouveau compte (gratuit).

Créez un nouveau "Repository", en le donnant le nom `devopsapi` :

![](/files/FQyjAlAzf42aubXjPj1X)

## Tag

Nous voulons maintenant télécharger notre image sur Docker Hub.

Nous devons d'abord changer son nom (autrement dit sa balise) pour qu'elle fasse référence à Docker Hub :

```sh
docker tag devops_api_prod  [VOTRE NOM D'UTILISATEUR DOCKER HUB]/devopsapi:1.0.0
```

## Connexion

Nous devons nous connecter à Docker Hub afin de pousser notre image.

Dans Docker Hub (navigateur), cliquez sur votre profil (en haut à droite), le menu " Profil ", puis " Sécurité ".

Ajouter un nouveau "Access Token". Copiez le jeton d'accès généré, vous ne le verrez qu'une seule fois !

Ensuite, de retour dans votre terminal, exécutez :

```sh
docker login -u [VOTRE NOM D'UTILISATEUR DOCKER HUB]
```

À la demande de mot de passe, collez votre jeton d'accès.

## Push

Vous êtes maintenant connecté à Docker Hub. Vous pouvez télécharger votre nouvelle image en utilisant :

```bash
docker push [VOTRE NOM D'UTILISATEUR DOCKER HUB]/devopsapi:1.0.0
```

Votre image est maintenant disponible sur Docker Hub !

Allez jeter un coup d'oeil dans le navigateur !

## Tester

Testons notre image ! D'abord arrêtez votre serveur dans votre DevContainer.

```sh
# Enlever la version locale, pour forcer la version de Docker Hub
docker image rm [VOTRE NOM D'UTILISATEUR DOCKER HUB]/devopsapi:1.0.0

# Lancer l'image de Docker Hub
docker run -p 5151:5055 [VOTRE NOM D'UTILISATEUR DOCKER HUB]/devopsapi:1.0.0
```

Vous verrez :

```bash
Unable to find image 'drkevinglass/devopsapi:1.0.0' locally
1.0.0: Pulling from drkevinglass/devopsapi
Digest: sha256:51993446c5fe441232e2673df6e26eb71ad2833297642a9f38b9da0803b20657
Status: Downloaded newer image for drkevinglass/devopsapi:1.0.0

> server@1.0.0 start-api
> node ./server.js

info: API Listening on port 5055 {"tag":"exec"}
```

Vous pouvez maintenant tester votre API qui tourne dans votre image déployée !

```sh
curl http://127.0.0.1:5151/info

# Resultat :
{"title":"DevOps Code Samples API","host":"3cb5633d0e7a","platform":"linux","type":"Linux","database":{"state":"disconnected","error":"getaddrinfo ENOTFOUND dbms"}}
```

D'accord, mais comment déployer cela dans notre infrastructure ?


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://docs.glassworks.tech/devops/deploiement-avec-k8s/image-docker.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
