docker-compose: почему здесь вызывается мое приложение на python? - PullRequest
0 голосов
/ 22 марта 2019

Я почесал голову некоторое время с этим. У меня есть следующий Dockerfile для моего приложения на Python:

# Use an official Python runtime as a parent image
FROM frankwolf/rpi-python3

# Set the working directory to /app
WORKDIR /app

# Copy the current directory contents into the container at /app
COPY . /app
RUN chmod 777 docker-entrypoint.sh

# Install any needed packages specified in requirements.txt
RUN pip3 install --trusted-host pypi.python.org -r requirements.txt

# Run __main__.py when the container launches
CMD ["sudo", "python3", "__main__.py", "-debug"] # Not sure if I need sudo here

docker-compose file:

version: "3"

services:
    mongoDB:
        restart: unless-stopped
        volumes:
            - "/data/db:/data/db"
        ports:
            - "27017:27017"
            - "28017:28017"
        image: "andresvidal/rpi3-mongodb3:latest"
    mosquitto:
        restart: unless-stopped
        ports:
            - "1883:1883"
        image: "mjenz/rpi-mosquitto"
    FG:
        privileged: true
        network_mode: "host"
        depends_on:
            - "mosquitto"
            - "mongoDB"
        volumes:
            - "/home/pi:/home/pi"
        #image: "arkfreestyle/fg:v1.8"
        image: "test:latest"
        entrypoint: /app/docker-entrypoint.sh
        restart: unless-stopped

А вот как выглядит docker-entrypoint.sh:

#!/bin/sh
if [ ! -f /home/pi/.initialized ]; then
    echo "Initializing..."
    echo "Creating .initialized"
    # Create .initialized hidden file
    touch /home/pi/.initialized

else
    echo "Initialized already!"
    sudo python3 __main__.py -debug
fi

Вот что я пытаюсь сделать:

(Этот материал уже работает)

1) Мне нужен образ докера, который запускает мое приложение python, когда я запускаю его в контейнере. (это работает)

2) Мне нужен файл docker-compose, который запускает 2 службы + мое приложение python, НО перед запуском моего приложения python мне нужно выполнить некоторую работу по инициализации, для этого я создал сценарий оболочки docker-entrypoint.sh. Я хочу выполнить эту инициализацию ТОЛЬКО ОДИН РАЗ, когда я впервые разверну свое приложение на компьютере . Поэтому я создаю скрытый файл .initialized, который я использую для проверки в моем сценарии оболочки.

Я прочитал, что использование точки входа в файле docker-compose перезаписывает любую старую точку входа / cmd, переданную в Dockerfile. Вот почему в остальной части моего сценария оболочки я вручную запускаю свой код, используя «sudo python3 main .py -debug», эта часть else работает нормально.

(это главный вопрос)

В части if я не запускаю свое приложение в сценарии оболочки. Я тестировал сам скрипт оболочки отдельно, операторы if и else работают так, как я ожидал, но когда я запускаю «sudo docker-compose up», первый раз, когда мой скрипт оболочки достигает части if, он повторяет два оператора, создает скрытый файл и ТО ЗАПУСКАЕТ МОЕ ПРИЛОЖЕНИЕ . Вывод на консоль для приложения отображается фиолетовым / розовым / mauve, тогда как другие две службы выводят свои журналы на желтый и голубой. Я не уверен, имеют ли значение цвета, но в нормальном состоянии журналы моего приложения всегда зеленые, фактически первые два эха «Инициализация» и «Создание .initialized» также зеленые! поэтому я подумал упомянуть эту деталь. После этих двух отголосков моё приложение загадочно начинается и записывает вывод консоли в фиолетовый цвет ...

Почему / как мое приложение вызывается в операторе if скрипта оболочки?

(Это происходит, только если я запускаю через docker-compose, а не если я просто запускаю сценарий оболочки с sh docker-entrypoint.sh)

1 Ответ

1 голос
/ 22 марта 2019

Задача 1

Использование ENTRYPOINT и CMD одновременно имеет некоторые странные эффекты .

Задача 2

Это происходит с вашим контейнером:

  1. Запускается в первый раз. Файл .initialized не существует.
  2. Дело if выполнено. Файл создан.
  3. Скрипт и, следовательно, контейнер заканчиваются.
  4. Опция restart: unless-stopped перезапускает контейнер.
  5. Файл .initialized существует, дело else запущено.
  6. python3 __main__.py -debug выполнено.

Кстати, команда USER в Dockerfile или опция user в Docker Compose являются лучшими параметрами, чем sudo.

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