Как запустить несколько скриптов Python и исполняемых файлов с помощью Docker? - PullRequest
0 голосов
/ 25 декабря 2018

Я хочу создать контейнер, содержащий два пакета Python и пакет с исполняемым файлом.


Это дерево моего основного пакета (dockerized_packeg):

dockerized_project
├── docker-compose.yml
├── Dockerfile
├── exec_project
│   ├── config
│   │   └── config.json
│   ├── config.json
│   ├── gowebapp
├── pythonic_project1
│   ├── __main__.py
│   ├── requirements.txt
│   ├── start.sh
│   └── utility
│       └── utility.py
└── pythonic_project2
    ├── collect
    │   ├── collector.py
    ├── __main__.py
    ├── requirements.txt
    └── start.sh

Содержимое Dockerfile:

FROM ubuntu:18.04

MAINTAINER Benyamin Jafari <benyamin@infravision.ir>

ENV PYTHONUNBUFFERED 1

RUN apt update

RUN apt-get install -y python3.6 python3-pip python3-dev build-essential gcc \
    libsnmp-dev snmp-mibs-downloader

RUN pip3 install --upgrade pip

RUN mkdir /app
WORKDIR /app
COPY . /app

WORKDIR /app/snmp_collector
RUN pip3 install -r requirements.txt
WORKDIR /app/proto_conversion
RUN pip3 install -r requirements.txt

WORKDIR /app/pythonic_project1
CMD python3 __main__.py

WORKDIR /app/pythonic_project2
CMD python3 __main__.py

WORKDIR /app/exec_project
CMD ["./gowebapp"]

Содержимое Docker-compose:

version: '3'

services:
  proto_conversion:
      build: .
      image: pc:2.0.0
      container_name: proto_conversion
#      command: 
#        - "bash  snmp_collector/start.sh"
#        - "bash  proto_conversion/start.sh"
      restart: unless-stopped
      ports:
        - 8008:8008
      tty: true

Проблема:

Когда я запускаю этот проектс docker-compose up --build выполняется только последняя команда CMD, и я думаю, что предыдущие CMD команды в Dockerfile будут убиты, потому что, когда я прокомментировал две последние CMD, первая CMD работает нормально (CMD).

Есть ли какой-нибудь подход к запуску нескольких скриптов Python и исполняемого файла в фоновом режиме?

Я пытался использовать файлы bash, но тоже не получилось.

Ответы [ 3 ]

0 голосов
/ 25 декабря 2018

Как упомянуто в документации , в файле Docker может быть только одна CMD, и если их больше, последняя переопределяет другие и вступает в силу.Ключевым моментом использования Docker может быть изоляция ваших программ, так что на первый взгляд вы можете захотеть переместить их в отдельные контейнеры и общаться друг с другом, используя общий том или сеть Docker, но если вам действительно нужны их для запуска втот же контейнер, включающий их в сценарий bash и заменяющий последнюю CMD на CMD my_script.sh, будет запускать их рядом друг с другом:

#!/bin/bash

exec python3 /path/to/script1.py &
exec python3 /path/to/script2.py

Добавьте COPY run.sh в Dockerfile и используйте RUN chmod a+x run.sh, чтобы сделатьэто исполняемый файл.CMD должен быть CMD ["./run.sh"]

0 голосов
/ 25 декабря 2018

Лучше всего запускать их как три отдельных контейнера.Это вдвойне верно, поскольку вы берете три отдельных приложения, объединяете их в один контейнер и затем пытаетесь запустить из них три отдельных элемента.

Создайте отдельный файл Docker в каждом из подкаталогов вашего проекта.Это может быть проще, особенно для того, который содержит только скомпилированный двоичный файл

# execproject/Dockerfile
FROM ubuntu:18.04
WORKDIR /app
COPY . ./
CMD ["./gowebapp"]

Тогда в вашем файле docker-compose.yml есть три отдельных раздела для запуска контейнеров

version: '3'
services:
  pythonic_project1:
    build: ./pythonic_project1
    ports:
      - 8008:8008
    env:
      PY2_URL: 'http://pythonic_project2:8009'
      GO_URL: 'http://execproject:8010'
  pythonic_project2:
    build: ./pythonic_project2
  execproject:
    build: ./execproject

Если вына самом деле вы не можете переупорядочить ваши Dockerfiles, вы можете по крайней мере запустить три контейнера из одного изображения в файле docker-compose.yml:

services:
  pythonic_project1:
    build: .
    workdir: /app/pythonic_project1
    command: ./__main__.py
  pythonic_project2:
    build: .
    workdir: /app/pythonic_project1
    command: ./__main__.py

Есть несколько веских причин для структурирования вашего проекта с несколькими контейнерами и изображениями:

  • Если вы свернете свой собственный скрипт оболочки и используете фоновые процессы (как и другие ответы), он просто не заметит, если один из процессов умрет;здесь вы можете использовать механизм перезапуска Docker для перезапуска отдельных контейнеров.
  • Если у вас есть обновление для одной из программ, вы можете обновить и перезапустить только этот единственный контейнер и оставить остальные нетронутыми.
  • Если вы когда-либо используете более сложный контейнерный оркестратор (Docker Swarm, Nomad, Kubernetes), различные компоненты могут работать на разных хостах и ​​требовать меньшего блока ресурсов ЦП / памяти на одном узле.
  • Если вы когда-либо используетеболее сложный контейнерный оркестратор, вы можете индивидуально масштабировать компоненты, которые используют больше ЦП.
0 голосов
/ 25 декабря 2018

попробуйте через entrypoint.sh

ENTRYPOINT ["/docker_entrypoint.sh"]

docker_entrypoint.sh

#!/bin/bash

set -e

exec python3 not__main__.py &
exec python3 __main__.py 

символ & говорит, что вы запускаете службу как демон в фоновом режиме

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