繁体   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