我有一个 docker-compose.yml 文件,其中有三个服务,每个服务都是一个需要执行的 python 脚本。
每个服务都有一个dockerfile
在名为“python_tools”的文件夹中,我有三个子文件夹:
他们每个人一个文件:main.py
docker-compose.yml:
version: "3.1"
services:
scriptA:
image: python:3.9
volumes:
- ./python_tools/logs/scriptA:/opt/app/scriptA/log
build:
context: .
dockerfile: Dockerfile.scriptA
scriptB:
image: python:3.9
volumes:
- ./python_tools/logs/scriptB:/opt/app/scriptB/log
build:
context: .
dockerfile: Dockerfile.scriptB
scriptC:
image: python:3.9
volumes:
- ./python_tools/logs/scriptC:/opt/app/scriptC/log
build:
context: .
dockerfile: Dockerfile.scriptC
和每个 Dockerfile.scriptX: (注意这里我开始用 X 表示 A、B 和 C,以防止在不需要的地方重复)
FROM python:3.9
COPY ./python_tools/scriptX /opt/app/scriptX
WORKDIR /opt/app/scriptX
RUN pip install -r requirements.txt
ENTRYPOINT [ "python", "-u", "main.py" ]
现在,main.py 有如下代码:
def log(msg):
print(msg)
f = open("log/log.txt", "a+")
f.write(msg + "\r\n")
f.close()
if __name__ == "__main__":
log("Starting scriptX")
while(True):
do_something()
问题是,一旦我执行:
docker logs -f python_scriptB-1
我得到:
Starting scriptA
Traceback (most recent call last):
File "/opt/app/scriptA/main.py", line xx, in <module>
log("Starting scriptA")
File "/opt/app/scriptA/main.py", line xx, in log
f = open("log/log.txt", "a+")
FileNotFoundError: [Errno 2] No such file or directory: 'log/log.txt'
注意到脚本 B 已经启动了脚本 A 的代码? 我不确定这是怎么造成的。也许是一些缓存问题,但我不确定在这种情况下如何摆脱缓存?
所以问题是不知何故,它看起来像为脚本启动了错误的脚本代码。所以很可能是 scriptC 的容器在 scriptB 等中启动了 main.py
我在这里做错了什么?我的容器/服务设置是否有更好的通用解决方案?