Dockerfile是否需要为开发和生产环境分别创建不同的进程?

4
我有一个具有以下结构的项目。
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 dev使用django,并运行“python manage.py runserver”,但在生产环境中将运行“gunicorn api.wsgi”;前端则运行“npm start”,但我希望它基于不同的镜像运行。目前,由于当我使用“FROM node”时仅能找到“npm”命令,而且仅在使用“FROM kyma/docker-nginx”时才会出现“nginx”命令,因此Dockerfile仅适用于其中一个。
那么,在不同的环境中,我该如何将它们分开?
./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:
1个回答

1
您可以将脚本作为ENTRYPOINT,根据可在运行时设置的环境变量来运行其中一个命令或另一个命令:
docker run -e env=DEV
# or
docker run -e env=PROD

您可以在Docker Compose文件中设置相同的环境变量


好的,我将在所有镜像中添加以下内容: environment: - DEV (or PROD)但是我该如何在 Dockerfile 中使用它呢?我只需要在顶部有 ENTRYPOINT "DEV" 的两个部分吗? - cclloyd
@cclloyd,你的Dockerfile将调用一个唯一的脚本,根据环境变量的值调用正确的命令。 - VonC
但是,我该如何让容器基于不同的基础呢?(对Dockerfile的工作原理还不太熟悉) - cclloyd
@cclloyd 您需要构建一个能够同时安装两个框架的镜像。 - VonC

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接