Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to run multiple Python scripts and an executable files using Docker?

I want to create a container that is contained with two Python packages as well as a package consist of an executable file.


Here's my main package (dockerized_package) tree:

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 content:

FROM ubuntu:18.04
        
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 content:

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

Problem:

When I run this project with docker-compose up --build, only the last CMD command runs. Hence, I think the previous CMD commands are killed in Dockerfile because when I remove the last two CMD, the first CMD works well.

Is there any approach to run multiple Python scripts and an executable file in the background?

I've also tried with the bash files without any success either.

like image 582
Benyamin Jafari Avatar asked Dec 25 '18 08:12

Benyamin Jafari


People also ask

How do I run multiple python scripts at once?

Using terminal - this is the simplest way to do it . You execute any python script as “$python a.py”. Now, if you want multiple scripts, you can either open up multiple terminals and run diffent programs on each or, in the same terminal “$ python a.py&b.py&c.py” . This will execute all programs from the same terminal.

Can a Docker container run multiple applications?

It's ok to have multiple processes, but to get the most benefit out of Docker, avoid one container being responsible for multiple aspects of your overall application. You can connect multiple containers using user-defined networks and shared volumes.

How do I run multiple Docker commands?

Run Multiple Commands With Dockerfilethe semicolon (;) operator. the ambersand (&) operator. the AND (&&) operator. the OR (||) operator.


2 Answers

As mentioned in the documentation, there can be only one CMD in the docker file and if there is more, the last one overrides the others and takes effect. A key point of using docker might be to isolate your programs, so at first glance, you might want to move them to separate containers and talk to each other using a shared volume or a docker network, but if you really need them to run in the same container, including them in a bash script and replacing the last CMD with CMD run.sh will run them alongside each other:

#!/bin/bash

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

Add COPY run.sh to the Dockerfile and use RUN chmod a+x run.sh to make it executable. CMD should be CMD ["./run.sh"]

like image 190
Farzad Vertigo Avatar answered Sep 22 '22 07:09

Farzad Vertigo


try it via entrypoint.sh

ENTRYPOINT ["/docker_entrypoint.sh"]

docker_entrypoint.sh

#!/bin/bash

set -e

exec python3 not__main__.py &
exec python3 __main__.py 

symbol & says that you run service as daemon in background

like image 21
frankegoesdown Avatar answered Sep 20 '22 07:09

frankegoesdown