web-dev-qa-db-ja.com

docker-composeからDocker RUNコマンドで環境変数を使用可能にする方法は?

プロキシおよび非プロキシホスト環境の両方で実行したいDockerisedアプリケーションがあります。ホストに存在する場合にのみ、http_proxyなどの通常の環境変数をコンテナーにコピーして、この問題を解決しようとしています。

実行することで、そこの90%を取得できます。

set | grep -i _proxy=>proxies.env

トップレベルのスクリプトで、その後、私のdocker-compose.ymlで:

myserver:
  build: ./myserver
  env_file:
   - proxies.env

これにより、ホストの環境プロキシ変数が存在する場合、サーバーコンテナーにコピーされます。これらの変数は、コンテナー実行時に、つまりDockerfile CMDまたはENTRYPOINTが実行される段階で使用できるという意味で機能します。

ただし、DockerfileのRUNコマンドからビルドステップとしてnpmを実行する必要があるコンテナが1つあり、これらの変数はこの段階では存在しないように見えるため、npmはプロキシを見つけられず、ハングします。他の作品では、私が持っている場合

RUN set

dockerfileでは、proxies.envから変数を見ることができませんが、

docker exec -it myserver /bin/bash

そして、setを実行すると、proxies.envからすべてを見ることができます。

Docker-compose.ymlとDockerfileがプロキシを使用するホストとプロキシを使用しないホストの両方で動作するように、これらの変数をハードコーディングせずにコンテナのビルド時に表示する方法を推奨できますか?

(centos 7、docker-compose 1.3.1およびdocker 1.7.0で実行)

12
Francis Norton

たぶんあなたはこれを試すことができます:

RUNADDを呼び出す前に、.envファイルを画像に

ADD proxies.env proxies.env

次に、RUNステートメントのプレフィックスを付けます。

RUN export `cat proxies.env` && echo "FOO is $FOO and BAR is $BAR"

これにより、次の出力が生成されます。

root@armenubuntudev:~/Dockers/set-env# docker build -t ashimoon/envtest .
Sending build context to Docker daemon 3.584 kB
Sending build context to Docker daemon 
Step 0 : FROM ubuntu
 ---> 91e54dfb1179
Step 1 : ADD proxies.env proxies.env
 ---> Using cache
 ---> 181d0e082e65
Step 2 : RUN export `cat proxies.env` && echo "FOO is $FOO and BAR is $BAR"
 ---> Running in 30426910a450
FOO is 1 and BAR is 2
 ---> 5d88fcac522c
Removing intermediate container 30426910a450
Successfully built 5d88fcac522c
3
armen.shimoon

2016を更新、docker-compose 1.6.2、docker 1.10以降、 docker-compose.ymlバージョン2

これで args:サブセクションbuild: section 、これには非常に興味深い可能性が含まれています。

キーのみのビルド引数は、Composeが実行されているマシン上の環境値に解決されます

PR 265 (2016年1月)を参照

結果として、プロキシ変数をハードコーディングせずに導入する方法docker-compose.ymlファイル自体は、正確な構文を使用しています。

version: '2'
services:
  myservice:
    build:
      context: .
      args:
        - http_proxy
        - https_proxy
        - no_proxy

Docker-compose upを呼び出す前に、プロキシ環境変数が設定されていることを確認する必要があります。

export http_proxy=http://username:[email protected]:port
export https_proxy=http://username:[email protected]:port
export no_proxy=localhost,127.0.0.1,company.com

docker-compose up

その後、Dockerfiledocker-composeプロセスは、プロキシ変数値を自動的に取得しますが、docker-compose.ymlには、ハードコーディングされた特定の値は含まれません。

31
VonC

「環境」オプションが問題を解決するかもしれません。ドッカーの作成ファイルは次のようになります。

myserver:
   build: ./myserver
   environment:
   - HTTP_PROXY=192.168.1.8
   - VARIABLE=value
   - ...
5

docker-compose.yml

...
server:
  build: .
  args:
    env: $ENV
...

Dockerfile

ARG env

ENV NODE_ENV $env
2

この例はYUMを修正します。

version: '2'
services:  
  example-service:
    build:
      context: .
      args:
        http_proxy: proxy.example.com:80
0
Moriarty