docker compose environment 파일에서 환경 변수가 엉망인 이유는 무엇입니까?


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.

문제는 설정에서 내 가정이 잘못되어 환경 변수가 엉망이되는 것입니다. 환경 변수는 터미널에서 수동으로 실행될 때 허용됩니다. 도커 작성 파일은 다음과 같습니다.

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

매개 변수의 순서를 변경하려고 시도했지만 도움이되지 않았습니다. 또한 명령 줄에서 GUNICORN_CMD_ARGSset 을 사용하여 Gunicorn을 시작하려고 시도 했으며 올바르게 수락했습니다 (작업자 수 및 주소 확인). 그래서 문제가 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는 허용되지 않으므로 버전을 고수합니다 . 발신 단말기에 이미 설정되어 있어야합니다.
Moritz

답변:


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를 추가하십시오.

도커 파일 :

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.