【问题标题】:Separate processes for Dockerfile for dev and prod?用于开发和生产的 Dockerfile 的单独进程?
【发布时间】:2018-10-12 03:05:26
【问题描述】:

我有一个具有以下结构的项目。

ProjectName/
├── Dockerfile
├── api/
│   ├── Dockerfile
│   └── manage.py
├── docker-compose.yml
├── frontend/
│   ├── Dockerfile
│   ├── build/
│   └── src/
└── manifests/
    ├── development.yml
    └── production.yml

docker-compose.yml 有一个在两个环境中通用的数据库镜像,dev.yml 和 prod.yml 有相似但略有不同的生产和开发镜像。

示例:api 开发人员使用 django 并仅运行 python manage.py runserver,但在 prod 中它将运行 gunicorn api.wsgi

前端运行npm start,但在产品中,我希望它基于不同的图像。目前 dockerfile 仅适用于其中一种,因为 npm 命令仅在我使用 FROM node 时才出现,nginx 命令仅在我使用 FROM kyma/docker-nginx 时出现。

那么在不同的环境中如何将它们分开呢?

./frontend/Dockerfile:

FROM node

WORKDIR /app/frontend
COPY package.json /app/frontend

RUN npm install

EXPOSE 3000
CMD ["npm", "start"]

# Only run this bit in production environment, and not anything above this line.
#FROM kyma/docker-nginx
#COPY build/ /var/www
#CMD 'nginx'

./api/Dockerfile:

FROM python:3.5

RUN apt-get update \
    && apt-get install -y --no-install-recommends \
        postgresql-client \
    && rm -rf /var/lib/apt/lists/*

WORKDIR /app/api
COPY requirements.txt /app/api
RUN pip install -r requirements.txt

EXPOSE 8000

# Run this command in dev
CMD ["python", "manage.py", "runserver", "0.0.0.0:8000"]
# Run this command in prod
#CMD ["gunicorn", "api.wsgi", "-b 0.0.0.0:8000"]

./docker-compose.yml:

version: '3'

services:
  db:
    image: postgres
    restart: always
    ports:
  - "5432:5432"

volumes:
  node-modules:

./manifests/production.yml:

version: '3'

services:
  gunicorn:
    build: ./api
    command: ["gunicorn", "api.wsgi", "-b", "0.0.0.0:8000"]
    restart: always
    volumes:
      - ./api:/app/api
    ports:
      - "8000:8000"
    depends_on:
      - db
  nginx:
    build: ./frontend
    command: ["nginx"]
    restart: always
    volumes:
      - ./frontend:/app/frontend
      - ./frontend:/var/www
      - node-modules:/app/frontend/node_modules
    ports:
      - "80:80"

volumes:
  node-modules:

./manifests/development.yml:

version: '3'

services:
  django:
    build: ./api
    command: ["python", "manage.py", "runserver", "0.0.0.0:8000"]
    restart: always
    volumes:
      - ./api:/app/api
    ports:
      - "8000:8000"
    depends_on:
      - db
  frontend:
    build: ./frontend
    command: ["npm", "start"]
    restart: always
    volumes:
      - ./frontend:/app/frontend
      - node-modules:/app/frontend/node_modules
    ports:
      - "3000:3000"

volumes:
  node-modules:

【问题讨论】:

    标签: django docker nginx docker-compose gunicorn


    【解决方案1】:

    您可以将脚本作为 ENTRYPOINT 运行一个或另一个命令,具体取决于您可以在运行时设置的环境变量:

    docker run -e env=DEV
    # or
    docker run -e env=PROD
    

    您可以设置相同的environment variable in a docker compose file

    【讨论】:

    • 好的,所以我添加环境:- DEV(或 PROD)到所有图像。我如何在我的 Dockerfile 中使用它?我是否只有 2 个部分,顶部有 ENTRYPOINT "DEV"
    • @cclloyd 您的 dockerfile 会调用一个独特的脚本,该脚本会根据环境变量值调用正确的命令。
    • 但是我如何让容器基于不同的基础? (还不太熟悉 dockerfiles 的工作原理)
    猜你喜欢
    • 2016-03-27
    • 2010-12-21
    • 2018-06-15
    • 2021-11-07
    • 2021-12-01
    • 2011-10-04
    • 1970-01-01
    • 2018-03-08
    • 2016-09-23
    相关资源
    最近更新 更多