【问题标题】:How to set up separate .env for development and production using Docker如何使用 Docker 为开发和生产设置单独的 .env
【发布时间】:2019-09-10 06:51:55
【问题描述】:

来自我手动执行 ssh 到远程服务器的环境,执行 git pull 并创建我的 .env(因为它是 gitignored),我如何分离开发 .env 和生产 .env .我使用 docker-machine 创建了一个 AWS EC2 实例。我创建了一个production.yml 并做了docker-compose -f production.yml up -d。 EC2 机器中的容器接受了我的开发.env,这不是我想要的。

Dockerfile

FROM python:3.6-alpine
ENV PYTHONUNBUFFERED 1

RUN apk update && apk add postgresql-dev gcc python3-dev musl-dev git jpeg-dev zlib-dev libmagic
RUN python -m pip install --upgrade pip

RUN mkdir /writer-api
COPY requirements.txt /writer-api/
RUN pip install --no-cache-dir -r /writer-api/requirements.txt
COPY . /writer-api/
WORKDIR /writer-api

production.yml

version: "3"
services:
  postgres:
    restart: always
    image: postgres
    ports:
      - "5432:5432"
    volumes:
      - pgdata:/var/lib/postgresql/data/
  web:
    restart: always
    build: .
    command: gunicorn writer.wsgi:application -w 2 -b :8000
    environment:
      DEBUG: ${DEBUG}
      SECRET_KEY: ${SECRET_KEY}
      DB_HOST: ${DB_HOST}
      DB_NAME: ${DB_NAME}
      DB_USER: ${DB_USER}
      DB_PORT: ${DB_PORT}
      DB_PASSWORD: ${DB_PASSWORD}
      SENDGRID_API_KEY: ${SENDGRID_API_KEY}
      AWS_ACCESS_KEY_ID: ${AWS_ACCESS_KEY_ID}
      AWS_SECRET_ACCESS_KEY: ${AWS_SECRET_ACCESS_KEY}
      AWS_STORAGE_BUCKET_NAME: ${AWS_STORAGE_BUCKET_NAME}
    depends_on:
      - postgres
      - redis
    expose:
      - "8000"
  redis:
    restart: always
    image: "redis:alpine"
  celery:
    restart: always
    build: .
    command: celery -A writer worker -l info
    volumes:
      - .:/writer-api
    depends_on:
      - postgres
      - redis
  celery-beat:
    restart: always
    build: .
    command: celery -A writer beat -l info
    volumes:
      - .:/writer-api
    depends_on:
      - postgres
      - redis
  nginx:
    restart: always
    build: ./nginx/
    ports:
      - "80:80"
    depends_on:
      - web
volumes:
  pgdata:

【问题讨论】:

    标签: docker docker-compose environment-variables


    【解决方案1】:

    我猜你可以导出环境 shell 变量,然后根据环境使用.env。在工作区中创建一个dev.env & prod.env 文件。

    示例撰写 -

    version: '3'
    
    services:
      nginx:
        image: nginx
        ports:
          - '80'
        env_file:
          - ${ENVIRON}.env
    

    为 DEV 构建 -

    export ENVIRON=dev
    docker-compose up -d 
    

    为 PROD 构建 -

    export ENVIRON=prod
    docker-compose up -d 
    

    这样您就可以在 DEV 和 PROD 环境中使用相同的 compose 文件。

    【讨论】:

    • 我以前尝试过这种方法。我创建了dev.envprod.env。但是,当我在 Web 服务中添加 env_file: ./env/dev.env 时,env 变量仍然不可用。
    • @ vivekyad4v WARNING: The DEBUG variable is not set. Defaulting to a blank string. 与其余变量相同。这使我进一步研究了.env 文件和env_file 之间的区别,但我仍然无法理解它。
    • env_file 将在容器 .env 的撰写文件本身中可用
    • @vivekyad4v 我从docker-compose.yml 中删除了环境密钥,正如上面@LinPy 所暗示的那样。它工作正常
    • 很高兴听到这个消息,感谢您告诉我。我真的不建议维护不同的目录和 dockerfile,以防您根据环境变量进行隔离。
    【解决方案2】:

    productiondevcompose 文件设置在单独的文件夹中,并将.env 文件放入这些文件夹中

    【讨论】:

    • 似乎不起作用。我已将docker-compose.yml 移至compose/dev/docker-compose.yml。 Docker compose 仍然在根目录中查找 .envDockerfile
    • 我用docker-compose -f compose/dev/docker-compose.yml up -d启动了它
    • 您需要在文件夹 compose/dev/ 作为工作目录,所以只能在 .env 上查看,所以 cd 到文件夹并运行 docker-compose up -d
    • 这样做了,环境变量被选中了。但仍然得到Cannot locate specified Dockerfile: Dockerfile
    • 在您的撰写中添加上下文上下文应该是您撰写的相对路径,请参阅docs.docker.com/compose/compose-file/#context
    猜你喜欢
    • 1970-01-01
    • 2016-04-07
    • 2016-10-21
    • 1970-01-01
    • 1970-01-01
    • 2010-12-21
    • 2012-10-08
    • 2021-07-29
    • 2023-03-17
    相关资源
    最近更新 更多