Отдельные процессы для Dockerfile для dev и prod? - PullRequest
0 голосов
/ 02 мая 2018

У меня есть проект со следующей структурой.

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 имеют похожие, но немного отличающиеся образы для production и dev.

Пример: api dev использует django и просто запускает python manage.py runserver, но в prod он будет запускать gunicorn api.wsgi.

И интерфейс запускается npm start, но в prod я хочу, чтобы он был основан на другом изображении. В настоящее время dockerfile работает только с одним или другим, поскольку команда npm обнаруживается только при использовании FROM node, а команда nginx отображается только при использовании FROM kyma/docker-nginx.

Так как я могу выделить их, когда в разных средах?

. / Фронтенд / 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'

/ апи / 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:
.

/ манифесты / 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:
.

/ манифесты / 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 Ответ

0 голосов
/ 02 мая 2018

В качестве ENTRYPOINT можно использовать сценарий, выполняющий одну или другую команду, в зависимости от переменной среды, которую вы можете установить во время выполнения:

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

Вы можете установить ту же самую переменную окружения в файле составления Docker .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...