我已经为此抓挠了一段时间。我的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脚本时发生)
答案 0 :(得分:1)
同时使用ENTRYPOINT
和CMD
会有一些strange effects。
这发生在您的容器上:
.initialized
文件不存在。if
情况。文件已创建。restart: unless-stopped
选项重新启动容器。.initialized
文件现在存在,运行else
情况。python3 __main__.py -debug
被执行。顺便说一下,Dockerfile中的USER
命令或Docker Compose中的user
选项比sudo
更好。