Mengapa variabel lingkungan hancur dalam buruh pelabuhan membuat file lingkungan

10

Konteks: komposisi buruh pelabuhan untuk memulai beberapa wadah, termasuk Gunicorn yang memanggil aplikasi Flask. Saya menggunakan file lingkungan web/env.gunicornuntuk menyimpan konfigurasi startup Gunicorn saya. File ini berisi

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

Masalahnya adalah bahwa GUNICORN_CMD_ARGStidak diproses dengan benar di suatu tempat di dalam pipa. Kesalahan yang saya dapatkan saat menjalankan docker logs gunicornadalah

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

Pertanyaannya adalah, di mana dalam pengaturan saya asumsi saya salah, sehingga menyebabkan variabel lingkungan menjadi hancur? Variabel lingkungan diterima ketika dijalankan secara manual di terminal. File penulisan docker tampak sebagai berikut

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:
Moritz
sumber
Tidak menggunakan gunicorn, tetapi membaca dokumen tidak ada = keluar dari catatan di tentang variabel env. Saya akan mencoba dengan spasi, tapi sepertinya tidak menguraikan argumen yang benar dan karena itu mungkin bug di gunicorn (membalikkan argumen agar diakhiri oleh argumen mengikat mungkin merupakan solusi atau menunjukkan masalah split dengan parameter pekerja)
Tensibai
Saya mencoba mengubah urutan parameter, tetapi itu tidak membantu. Saya juga mencoba memulai Gunicorn dari baris perintah dengan GUNICORN_CMD_ARGSset, dan itu menerimanya dengan benar (# pekerja dan alamat diperiksa). Itu sebabnya saya kira masalahnya ada di pihak Docker.
Moritz
ERROR: build path /home/ben/devopsStackExchange/web either does not exist, is not accessible, or is not a valid URL.. Harap buat steps to reproduce paragraphdan tambahkan file yang diperlukan agar orang lain dapat membantu Anda dengan setidaknya mengizinkan mereka mereproduksi masalah.
030
Silakan tambahkan setidaknya Dockerfile Gunicorn.
030
Saya tidak menggunakan Gunicorn Dockerfile. Saya akan tetap menggunakan command: gunicorn thymedata:app --bind=127.0.0.1:8001 --workers=3versi, karena variabel yang dimuat melalui env_filetidak diterima. Mereka harus sudah diatur di terminal panggilan.
Moritz

Jawaban:

2

Setelah membaca bab perintah dan menemukan sampel ini , sepertinya kebiasaan GUNICORN_CMD_ARGSdapat dihilangkan dengan hanya meneruskan argumen secara langsung:

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

Jika seseorang benar-benar ingin menggunakan variabel maka itu bisa dilakukan sebagai berikut:

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

.env

GUNICORN_BIND_ADDRESS=127.0.0.1:8001
GUNICORN_WORKERS=3
030
sumber
$ {GUNICORN_BIND_ADDRESS} hanya akan mengevaluasi variabel yang sudah ada di terminal, tidak ada yang dimuat melalui env_file. Karena saya tidak menetapkan rahasia apa pun, itu solusi yang dapat diterima
Moritz
3

Saya memiliki masalah yang sama dan ini bekerja untuk saya tanpa merasa seperti hack ...

docker-compose.yml :

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

Catatan: tambahkan env GUNICORN_CMD_ARGS tanpa tanda kutip

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

Catatan: jalankan aplikasi CMD gunicorn: aplikasi tanpa opsi lewat array atau kutipan

Andres
sumber