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
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"