web-dev-qa-db-ja.com

Dockerスタックのデプロイによるホスト環境変数

docker stack deployコマンドが実行された場所から取得された環境変数の代わりに、コンテナがデプロイされたホストから取得された環境変数を使用する方法があるかどうか疑問に思いました。たとえば、次のdocker-compose.ymlが3ノードのDocker Swarmクラスターで起動されたとします。

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"

JMX_HOSTNAMEは、コンテナが実際にデプロイされているホストから取得する必要があり、すべてのコンテナで同じ値にすることはできません。これを行う正しい方法はありますか?

7

はい、これは2つの概念を組み合わせたときに機能します。

  1. Swarm ノードラベル 。このホスト名は組み込みのものの1つです。
  2. Swarm service go templates 。これはスタックファイルでも機能します。

これにより、各コンテナーが実行されているホストになるために、ホスト名がDUDEのENV値に引き込まれます。

version: '3.4'

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

env でdockerコマンドを実行すると機能します。

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

GitHubの問題 のおかげで、私は正しい方向に向かった。

3
Tim