Я почесал голову некоторое время с этим. У меня есть следующий 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)