Docker容器可以通过Dockerfile运行,但无法通过docker-compose运行。

3

I have the following Dockerfile:

FROM python:3.8-slim

RUN apt-get update && \
    apt-get install -y --no-install-recommends gcc libc-dev

WORKDIR /app

COPY . .

RUN pip install --no-cache-dir -r requirements.txt

CMD [ "python", "proxy-scraper-checker/main.py" ]

以下是docker-compose.yml文件内容:

version: "3.3"

services:
    proxy-app:
        build:
            context: .
            dockerfile: Dockerfile
        container_name: proxy-app
        environment:
           - PYTHONUNBUFFERED=1

如果我手动通过以下方式在docker cmd中运行Dockerfile:
C:\Projects\myprojects\docker-example>docker build --tag my_app .
C:\Projects\myprojects\docker-example>docker run --rm -it my_app

所有看起来都运作良好,我可以得到应用程序输出的日志,证明它确实在执行:

2020-05-30 13:38:53,454 - Thread-1 - INFO - Starting scheduler...
2020-05-30 13:38:55,457 - Thread-1 - INFO - Running job Every 2 seconds do run_pldown_job(<uvloop.Loop running=False closed=False debug=False>) (last run: [never], next run: 2020-05-30 13:38:55)
2020-05-30 13:38:55,457 - Thread-1 - INFO - Pldown Job starting...
80.187.140.26:8080 HTTPS Server/OS Error:
80.187.140.26:80 HTTP Server/OS Error:
146.148.59.22:80 HTTPS Server/OS Error:
89.216.39.217:4145 Error: Connection closed unexpectedly
185.49.93.102:4145 Error: Connection closed unexpectedly
80.240.250.222:4145 Error: Connection closed unexpectedly
185.123.2.170:1080 Error: Connection closed unexpectedly

然而,当我尝试通过以下方式使用docker-compose来执行我的应用程序时:
C:\Projects\myprojects\docker-example>docker-compose up

我的应用程序看起来启动正常,但是它没有继续执行。以下是输出:

Creating proxy-app ... done
Attaching to proxy-app
proxy-app    | 2020-05-30 13:28:02,638 - Thread-1 - INFO - Starting scheduler...

我尝试执行“show logs”命令:
C:\Projects\myprojects\docker-example>docker logs proxy-app

但是我只得到了一行日志,第一行是:
2020-05-30 13:28:02,638 - Thread-1 - INFO - Starting scheduler...

有什么建议吗?

更新:

我尝试使用docker构建镜像:

docker build --tag my_app .

我在compose文件中使用了这个镜像:

version: "3.3"

services:
    proxy-app:
        image: my_app

它实际上是这样工作的。

然而,问题仍然存在,为什么我用这种方式它不起作用:

version: "3.3"

services:
    proxy-app:
        build:
            context: .
            dockerfile: Dockerfile
        container_name: proxy-app

你的服务在compose文件中是什么样子的? - james
抱歉,我错过了那部分内容,请耐心等待。 - james
这是一个棘手的问题 - 如果您在compose脚本之外构建图像,然后从该图像执行compose脚本呢?我怀疑连接关闭错误仍然存在,但是以这种方式构建时日志中没有显示。 - james
1
像之前一样构建镜像,使用命令'docker build --tag my_app .',然后在compose文件中删除构建设置,只包含镜像名称 - 这样compose将使用已经构建的相同镜像。 - james
好的,所以我按照你告诉我的方式构建了镜像,并从docker-compose引用了该构建的镜像,这种方式很好...我可以看到与从Dockerfile直接执行时相同的输出...奇怪。我仍然不确定为什么使用我的构建设置在docker-compose中无法工作。 - Danny
显示剩余8条评论
1个回答

1
似乎我需要在我的docker-compose文件中添加一个卷,以便于当我通过docker-compose进行构建时,任何我所做的更改都能够真正地反映出来。因此,我的新docker-compose.yml如下:
version: '3'

services:
    db:
        image: postgres:latest
        container_name: postgres
        environment:
          - POSTGRES_DB=proxydb
          - POSTGRES_USER=danny
          - POSTGRES_PASSWORD=123
        ports:
            - "5432:5432"
        volumes:
            - ./init.sql:/docker-entrypoint-initdb.d/init.sql
    proxy-app:
        build: .
        container_name: proxy-app
        volumes:
            - ./src:/src

2
compose up 在第一次启动时构建镜像。之后,它会重复使用该镜像,直到您重新构建它。由于构建比仅启动需要更长的时间,我建议您将卷从您机器上代码所在的目录挂载到镜像中的应用程序目录。这样,当您对代码进行更改时,容器立即反映出这些更改,从而加快了开发速度。祝好运! - camba1
我安排好了我的回答。 - Danny

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接