三个带有 python 图像的 docker 容器在 docker compose 中混淆了

问题描述 投票:0回答:0

我有一个 docker-compose.yml 文件,其中有三个服务,每个服务都是一个需要执行的 python 脚本。

每个服务都有一个dockerfile

  • Dockerfile.scriptA
  • Dockerfile.scriptB
  • Dockerfile.scriptC

在名为“python_tools”的文件夹中,我有三个子文件夹:

  • 脚本A
  • 脚本B
  • 脚本C

他们每个人一个文件: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

我在这里做错了什么?我的容器/服务设置是否有更好的通用解决方案?

python docker docker-compose
© www.soinside.com 2019 - 2024. All rights reserved.