Statamic Peak

Article

Déployer automatiquement nos images Docker

Nous avons créé une image Docker, nous l'avons mise en ligne sur un registry, nous avons automatisé l'ensemble. Il nous reste à aller un cran plus loin avec le déploiement de notre image à jour.

Je vais vous expliquer les grands principes et vous donner un exemple avec Laravel Forge, l'outil que nous utilisons chez conciergerie.dev. Cependant, la façon de faire va grandement dépendre de votre environnement de production.

Cet article fait parti d'une série sur la release et le déploiement d'une application Phoenix Framework. Si vous voulez accéder aux autres articles :

Théoriquement, une fois que vous avez mis une nouvelle image en ligne sur votre registry, la dernière chose qu'il vous reste à faire est d'indiquer à votre production qu'elle doit mettre à jour le(s) conteneur(s).

Si vous utilisez un système simple comme Docker Compose ou des outils plus complexes, comme Docker Deploy, sans replica, vous allez avoir une interruption de service pendant l'arrêt et le redémarrage de votre conteneur.

Vous avez 3 façons de faire :

  • manuellement : dans ce cas, vous vous connectez vous-même à votre serveur pour initier la montée de version. Vous pouvez utiliser Ansible par exemple.

  • programmée dans le temps : vous créez une tâche planifiée qui récupère la dernière image et relance votre conteneur Docker ou votre Docker Compose.

  • en continu : au cours de notre pipeline de CI, on ajoute un instruction pour demander le déploiement de notre environnement de production.

En fonction des technologies que vous utilisez, vous pourrez plus facilement mettre en place l'une ou l'autre.

Dans notre cas, le serveur de production est relié à Laravel Forge, un outil qui simplifie les déploiements en proposant une url de trigger et une CLI pour effectuer la même chose. Nous allons faire au plus simple et utiliser une URL à ajouter à notre CI. Pour cela, on crée un nouveau secret sur Sourcehut et on fait simplement un curl à la fin.

tasks:
  - start_docker: |
      sudo service docker start
      sudo addgroup $(whoami) docker
  - login: |
      echo "$(cat ~/MY_SECRET_FILE)" | docker login $REGISTRY -u nologin --password-stdin
  - build: |
      cd Exercices.dev
      docker build . -t $IMAGE_VERSION
  - push: |
      docker push $IMAGE_VERSION
  - deploy: |
      curl $(cat ~/MY_URL_FILE)

Si nous n'avions pas utiliser Laravel Forge, une solution pour Docker est d'utiliser un Docker Context pour lancer nos commandes Docker Compose depuis la CI vers le serveur distant.