2017-03-29 13 views
0

ドッカーのコンテナと環境変数に問題があります。ドッカーをリモートホストにデプロイするときに環境変数を渡す

現在、私は次のように定義してドッカ-compose.ymlを持っている:

version: '2.1' 
services: 
    some-service: 
    build: 
     context: . 
    image: image/replacedvalues 
    ports: 
     - 8080 
    environment: 
     - PROFILE=acc 
     - ENVA 
     - ENVB 
     - TZ=Europe/Berlin 

    some-service-acc: 
    extends: 
     service: some-service 
    environment: 
     - SERVICE_NAME=some-service-acc 

私は、サーバーA上の(直接SSHコマンドラインを介して)これを手動で展開するときに今、それはサーバからの環境変数がかかります私のコンテナに入れてください。だから私はENVAENVB私のコンテナのホストからの値を持っています。次のコマンドを使用して(コースの画像を構築した後):docker-compose up some-service-acc

私たちは現在、より良いインフラストラクチャを開発しており、Jenkins経由でサービスを展開したいと考えています。 JenkinsはサーバBのドッキング・コンテナで稼動しています。

Jenkins(Job-DSL、DOCKER_HOST = "tcp:// serverA:2375"の一時設定)を介してサービスをデプロイできます。したがって、サーバーBのJenkins ContainerからServerA上のすべてのドッキング(作成)コマンドが実行されます。ENVAおよびENVBの値を持たない点を除いて、サービスは起動して実行されています。

ジェンキンスは仕事-DSLグルーヴィーなスクリプトで次のように実行します:

withEnv(["DOCKER_HOST=tcp://serverA:2375"]) { 
    sh "docker-compose pull some-service-acc" 
    sh "docker-compose -p some-service-acc up -d some-service-acc" 
} 

私はジェンキンスコンテナにとサーバーB自体にそれらを設定しようとしたが、どちらも働きました。私がServer Aに直接手動でデプロイした場合にのみ動作します。

私はドッキングウィンドウを使用して、私はenvブロックの次の出力を取得し、実行中のコンテナを検査する検査:

彼らはコンテナに渡されますように私は、環境変数を設定する必要があります
"Env": [ 
    "PROFILE=acc", 
    "affinity:container==JADFG09gtq340iggIN0jg53ij0gokngfs", 
    "TZ=Europe/Berlin", 
    "SERVICE_NAME=some-service-acc", 
    "ENVA", 
    "ENVB", 
    "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin", 
    "LANG=C.UTF-8", 
    "JAVA_VERSION=8", 
    "JAVA_UPDATE=121", 
    "JAVA_BUILD=13", 
    "JAVA_PATH=e9e7ea248e2c4826b92b3f075a80e441", 
    "JAVA_HOME=/usr/lib/jvm/default-jvm", 
    "JAVA_OPTS=" 
] 

?私はサーバーAに変数を格納する方が好きです。しかし、これが不可能な場合は、誰かがどのようにしてそれを行うことができるか説明することができますか? ではなく、です。作成ファイルまたは重要なデータが含まれているソースの他の場所にある値をハードコードするオプションです。

私が間違った場所でこの質問をしている場合は、私がどこにあるべきかに私をリダイレクトしてください。

ありがとうございます!

答えて

2

docker-composeコマンドラインを実行しているシェルで環境変数を設定する必要があります。ジェンキンスでは、そのは最高(ジェンキンスはビルドスレーブ内のホスト環境を使用していない)あなたのGroovyスクリプト内でも行われています:

withEnv(["DOCKER_HOST=tcp://serverA:2375", "ENVA=hello", "ENVB=world"]) { 
    sh "docker-compose pull some-service-acc" 
    sh "docker-compose -p some-service-acc up -d some-service-acc" 
} 

編集を:コメントから、あなたはまた、秘密を通過したいです。

これを行うには、Mask Passwordのようなプラグインがあります。このプラグインを使用すると、ログやジョブ構成に変数が表示されずに変数を渡すことができます。 (私は、ジェンキンズ自身がそれを知っていて、それをあなたのスクリプトに平文で渡しているので、決定された侵入者はまだ価値を得ることができると確信しています)

より良いオプションは、ドッカーの中に秘密管理ツールを使用することです。Hashicorp has their Vault productは、暗号化されたK/Vストアを実装しています。このストアでは、値に時間制限のトークンを使用してアクセスし、ターゲットシステムへの統合で要求ごとに新しいパスワードを生成できます。私はこれを完全に構成したときに最高レベルのセキュリティと見なしますが、自分のニーズに合わせて無数の方法を設定することができます。秘密を引き出し、それをあなたのコンテナの環境に注入するために何かを書く必要があります(それは、あなたがエントリーポイントに追加することができる残りのプロトコルです)。

Dockerの最新のオプションは、新しいSwarmモードを必要とする秘密管理です。あなたは秘密をswarmに保存して、entry in the docker-compose.yml version 3 formatを使ってファイルとして必要なコンテナに追加します。すでにスウォームモードを使用していて、docker-composeの代わりにdocker stack deployでコンテナを起動できる場合は、これを実装するのはかなり簡単な解決策です。

+0

重要なデータが含まれているため、ハードコードは私にとってはオプションではありません。また、ServerAにデプロイするサービスでのみ、すべてのデプロイメントで環境変数は必要ありません。しかし、正しいとすれば、 'DOCKER-HOST'以外の' docker-compose'コマンドの瞬間には他の環境変数はありませんか? – Clemenz

+1

DOCKER_HOST、最小PATH、およびJenkinsによって定義されたさまざまな変数。秘密のための他のオプションがあります、私はそれのために私の答えを更新します。 – BMitch

+0

広範な答えをありがとう。私はそれを正しい答えとして受け入れます。見るべきことがたくさんあります。すべての情報をありがとう。 – Clemenz

関連する問題