Outils pour utilisateurs

Outils du site


sysadmin:docker:obtenir_nom_conteneur_depuis_interieur

Déterminer le nom du conteneur depuis l’intérieur

Via docker-compose on peut facilement démarrer l’exécution de plusieurs instances d'un même service via l'argument --scale. Par défaut, comme toutes les instances du service partagent la même configuration elles adoptent le même comportement:

docker-compose up -d --scale service_1=3 --scale service_n=5

Dans cet exemple on instancie 3 conteneurs pour “service_1” et 5 conteneurs pour “service_n”

Il peut alors être utile de récupérer un certains nombre d'informations depuis l'intérieur du conteneur comme le nom de celui ou son numéro d'instance attribué par docker-compose lors du scaling horizontal. Le programme s’exécutant à l'intérieur du conteneur pourra ainsi adapter sa configuration, son comportement etc.

Cependant pour pouvoir obtenir des informations depuis un processus s’exécutant à l’intérieur du conteneur, il faut au préalable configurer spécifiquement ce conteneur. Il est nécessaire de faire un montage lié (bind mount) en lecture seule de la socket créée par le daemon docker.

Une fois le montage déclaré on peut interroger la socket via des outils tels que curl et jq

Modification du docker-compose

Ajouter le montage en lecture seule:

version: "3.3"

networks:
  vnet:

services:
  paperboy_sim:
    build: 
      context: $PWD/paperboy_sim
      dockerfile: Dockerfile
      args:
        TZ: Europe/Paris
    image: tnf/paperboy_sim:v1.0
    environment: {}
    networks:
      - vnet
    volumes:
      # Montage en lecture seule de la socket du daemon Docker utilisé pour obtenir le nom du service
      - /run/docker.sock:/run/docker.sock:ro
    labels:
      - "tnf.project=PaperSurvey"

Comme le docker-compose est modifié, on arrête et supprime le service puis on le recrée.

docker-compose rm -s paperboy_sim
docker-compose up -d --scale paperboy_sim=4

Depuis le conteneur on peut à présent obtenir les informations en interrogeant la socket:

# ouvrir une console dans le conteneur
docker container exec -it paperboy_sim_2 /bin/bash
 
# Extraction du numéro d'instance du service attribué par docker-compose lors du scale
curl -s --unix-socket /run/docker.sock http://docker/containers/$HOSTNAME/json | jq ".Config.Labels.\"com.docker.compose.container-number\""
 
"2"

Références

sysadmin/docker/obtenir_nom_conteneur_depuis_interieur.txt · Dernière modification : 2021/12/12 19:38 de yoann