簡體   English   中英

docker-compose:為什么在這里調用我的python應用程序?

[英]docker-compose: Why is my python application being invoked here?

我已經為此撓了一下頭。 我的python應用程序具有以下Dockerfile:

# 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文件:

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應用程序時運行的docker映像。 (這有效)

2)我需要一個運行2個服務+我的python應用程序的docker-compose文件,但是在運行python應用程序之前,我需要做一些初始化工作,為此,我創建了一個shell腳本docker-entrypoint.sh。 我只想在第一次將應用程序部署到計算機上時進行一次初始化工作。 所以我正在創建一個.initialized隱藏文件,用作我的shell腳本中的檢查。

我讀到在docker-compose文件中使用入口點會覆蓋提供給Dockerfile的所有舊入口點/ cmd。 因此,這就是為什么在我的shell腳本的else部分中,我使用“ sudo python3 main .py -debug”手動運行代碼時,else部分可以正常工作的原因。

(這是主要問題)

在if部分中,我沒有在shell腳本中運行我的應用程序。 我已經分別測試了shell腳本本身,if和else語句均按預期工作,但是當我運行“ sudo docker-compose up”時,我的shell腳本第一次遇到if部分時,它會回顯這兩個語句,隱藏文件然后運行我的應用程序 對於應用程序,控制台輸出以紫色/粉紅色/淡紫色顯示,而其他兩個服務以黃色和青色顯示其日志。 我不確定顏色是否重要,但是在正常情況下,我的應用程序日志始終為綠色,實際上前兩個回聲“ Initializing”和“ Creating .initialized”也為綠色! 所以我想提到這個細節。 在這兩個回聲之后,我的應用程序開始神秘地啟動,並以紫色記錄控制台輸出...

為什么/如何在shell腳本的if語句中調用我的應用程序?

(這只會在我通過docker-compose運行時發生,而不是僅在我使用sh docker-entrypoint.sh運行shell腳本時發生)

問題1

同時使用ENTRYPOINTCMD會有一些奇怪的效果

問題2

這發生在您的容器上:

  1. 它是第一次啟動。 .initialized文件不存在。
  2. if執行case。 文件已創建。
  3. 腳本並因此結束容器。
  4. restart: unless-stopped選項重新啟動容器。
  5. .initialized文件現在存在, else運行案例。
  6. python3 __main__.py -debug被執行。

順便說一句,Dockerfile中的USER命令或Docker Compose中的user選項比sudo更好。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM