web-dev-qa-db-fra.com

Variables d'environnement hôte avec déploiement de la pile Docker

Je me demandais s'il y avait un moyen d'utiliser des variables d'environnement provenant de l'hôte où le conteneur est déployé, au lieu de celles prises d'où la commande docker stack deploy Est exécutée. Par exemple, imaginez le docker-compose.yml Suivant lancé sur un cluster Docker Swarm à trois nœuds:

version: '3.2'
services:
  kafka:
    image: wurstmeister/kafka
    ports:
      - target: 9094
        published: 9094
        protocol: tcp
        mode: Host
    deploy:
      mode: global
    environment:
      KAFKA_JMX_OPTS: "-Djava.rmi.server.hostname=${JMX_HOSTNAME} -Dcom.Sun.management.jmxremote -Dcom.Sun.management.jmxremote.authenticate=false -Dcom.Sun.management.jmxremote.ssl=false -Dcom.Sun.management.jmxremote.rmi.port=1099"

Le JMX_HOSTNAME Doit provenir de l'hôte sur lequel le conteneur est réellement déployé et ne doit pas avoir la même valeur pour chaque conteneur. Existe-t-il une bonne façon de procéder?

7
Alessandro Dionisi

Oui, cela fonctionne lorsque vous combinez deux concepts:

  1. Swarm étiquettes de nœuds , dont Hostname est l'un des noms intégrés.
  2. Swarm service go templates , qui fonctionne également dans les fichiers de pile.

Cela ramènerait le nom d'hôte à la valeur ENV de DUDE pour chaque conteneur pour être l'hôte sur lequel il s'exécute:

version: '3.4'

services:
  nginx:
    image: nginx
    environment:
      DUDE: "{{.Node.Hostname}}"
    deploy:
      replicas: 3
16
Bret Fisher

Cela fonctionne si vous exécutez la commande docker via env .

env JMX_HOSTNAME="${JMX_HOSTNAME}" docker stack deploy -c docker-compose.yml mystack

Un crédit à problème GitHub qui m'a fait pointer dans la bonne direction.

3
Tim