docker compose環境ファイルで環境変数が壊れているのはなぜですか


10

コンテキスト:docker-composeは、Flaskアプリを呼び出すGunicornなど、いくつかのコンテナーを起動します。環境ファイルweb/env.gunicornを使用して、Gunicornスタートアップ構成を保存しています。このファイルには

GUNICORN_CMD_ARGS="--bind=127.0.0.1:8001 --workers=3"

問題はGUNICORN_CMD_ARGS、パイプラインのどこかで正しく処理されないことです。実行中に発生するエラーdocker logs gunicorn

Error: '8001 --workers=3' is not a valid port number.

問題は、私の設定のどこに私の仮定が間違っているのですか?端末で手動で実行すると、環境変数が受け入れられます。docker composeファイルは次のようになります

version: "3"
services:
#  nginx:
#    image: nginx:latest
#    ports:
#      - "80:80"
#    volumes:
#      - ./nginx:/etc/nginx/conf.d
#    depends_on:
#      - web

  web:
    build: ./web
    container_name: gunicorn
    ports:
      - "8001:8001"
    environment:
      - APP_CONFIG_FILE=../config/development.py
    env_file:
      - 'web/env.gunicorn'
    networks:
      - backend
    command: gunicorn thymedata:app
    depends_on:
      - influxdb
      - grafana

  influxdb:
    image: influxdb:latest
    container_name: influxdb
    ports:
      - "8086:8086"
    env_file:
      - 'influxdb/env.influxdb'
      - 'influxdb/secrets.influxdb'
    networks:
      - backend
    volumes:
      - influxdb-data:/var/lib/influxdb

  grafana:
    image: grafana/grafana:latest
    container_name: grafana
    ports:
      - "3000:3000"
    env_file:
      - 'grafana/env.grafana'
      - 'grafana/secrets.grafana'
    networks:
      - backend
    volumes:
      - grafana-data:/var/lib/grafana
    depends_on:
      - influxdb

networks:
  backend:

volumes:
  influxdb-data:
  grafana-data:

gunicornを使用していませんが、ドキュメントを読んでいる場合、env変数についての注釈から=サインアウトすることはできません。私はスペースで試しますが、それは複数の引数を適切に解析しないように聞こえるので、おそらくそれはgunicornのバグかもしれません(バインド引数で終了するように引数の順序を逆にすることは回避策であるか、労働者パラメーター)
Tensibai

パラメータの順序を変更してみましたが、効果はありませんでした。また、コマンドラインからsetを使用してGunicornを起動しようGUNICORN_CMD_ARGSとしましたが、正しく受け入れられました(ワーカー数とアドレスがチェックされています)。そのため、Docker側に問題があると思います。
Moritz、

ERROR: build path /home/ben/devopsStackExchange/web either does not exist, is not accessible, or is not a valid URL.。を作成しsteps to reproduce paragraph、必要なファイルを追加して、他の人が少なくとも問題の再現を許可できるようにしてください。
030

少なくともGunicorn Dockerfileを追加してください。
030

Gunicorn Dockerfileは使用しません。をcommand: gunicorn thymedata:app --bind=127.0.0.1:8001 --workers=3介しenv_fileてロードされた変数は受け入れられないため、バージョンに固執します。それらは、呼び出し側端末ですでに設定されている必要があります。
モリッツ

回答:


2

コマンドの章を読みこのサンプルを見つけた後GUNICORN_CMD_ARGS、引数を直接渡すだけでカスタムを省略できるように見えます。

command: gunicorn thymedata:app --bind=127.0.0.1:8001 --workers=3

変数を本当に使用したい場合は、次のように実行できます。

command: gunicorn thymedata:app --bind=${GUNICORN_BIND_ADDRESS} --workers=${GUNICORN_WORKERS}

.env

GUNICORN_BIND_ADDRESS=127.0.0.1:8001
GUNICORN_WORKERS=3

$ {GUNICORN_BIND_ADDRESS}はすでに端末にある変数のみを評価し、を介して読み込まれるものは評価しませんenv_file。私は秘密を設定していませんので、それは許容できる解決策です
Moritz

3

私は同様の問題を抱えていましたが、これはハックのように感じることなくうまくいきました...

docker-compose.yml

version: '3'
services:
   web:
      build .
      environment:
      - GUNICORN_CMD_ARGS=--workers=0 --bind=0.0.0.0:8000 --timeout=10

注:引用符なしでenv GUNICORN_CMD_ARGSを追加します

Dockerfile

FROM python:3.6-slim
COPY requirements.txt ./
RUN pip install --no-cache-dir -r requirements.txt
ENV GUNICORN_CMD_ARGS="--bind=0.0.0.0:8000 --workers=3"
CMD gunicorn app:app

注:配列または引用符でオプションを渡さずにCMD gunicorn app:appを実行します

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.