【问题标题】:Docker-compose works, just Docker using Dockerfile - does not. Why?Docker-compose 有效,只是 Docker 使用 Dockerfile - 没有。为什么?
【发布时间】:2021-02-27 02:52:24
【问题描述】:

无论如何,我都不是 Docker 专家,所以也许它有一个简单的解决方案。我有这样的“奇怪”问题: 长期以来,我在本地开发中使用 Docker-compose 为我的 Python Flask gunicorn 服务器设置了一个非常简单的设置,我的 docker-compose.yaml 看起来像这样:

version: '2'

services: 
    website:
        build: .
        command: >
            gunicorn -b 0.0.0.0:443
            --reload
            --workers=2
            --timeout 0
            --certfile=scert.crt
            --keyfile=skey.key
            db_app.app:create_app()
        environment: 
            PYTHONUNBUFFERED: 'true'
        volumes: 
            - '.:/db_app'
        ports: 
            - '443:443'

我通常以docker-compose up --build 启动它,刷新本地文件会自动重建服务器等等 - 很棒。客户端应用程序连接也没有任何问题。但现在我需要让它与 Dockerfile 一起工作(把它放在 Google Cloud Run 上)。我想出了这个:

FROM python:3.8-slim

ENV PYTHONUNBUFFERED True

ENV INSTALL_PATH /db_app
RUN mkdir -p ${INSTALL_PATH}

WORKDIR ${INSTALL_PATH}

COPY requirements.txt requirements.txt
RUN pip install -r requirements.txt

COPY . .

EXPOSE 443
CMD exec gunicorn --bind 0.0.0.0:443 --reload --workers=2 --threads 8 --timeout 0 --certfile=scert.crt --keyfile=skey.key db_app.app:create_app

它构建正常,运行正常但是.. 每当我尝试连接我的客户端应用程序时,我都会收到 503。它发生在 Google Cloud Run 和本地,我只是看不到来自服务器的任何输出,甚至虽然它确实运行(当它以docker run containername 启动时,所以它执行 dockerfile 而不是 docker-compose(它工作得很好))。我做错了什么?

附加信息:

docker run containername ls -l /db_app的结果

total 28
drwxr-xr-x 3 root root 4096 Sep 17 16:12 config
-rw-r--r-- 1 root root  496 Nov 14 11:13 docker-compose.yaml
drwxr-xr-x 2 root root 4096 Sep 16 20:34 instance
-rw-r--r-- 1 root root  252 Oct 11 15:37 requirements.txt
-rwxrwxrwx 1 root root 1456 Oct 15 14:09 scert.crt
-rwxrwxrwx 1 root root 1704 Oct 15 14:09 skey.key
drwxr-xr-x 3 root root 4096 Oct 27 18:05 db_app

【问题讨论】:

  • 你能把docker run containername ls -l /db_app的结果贴出来吗?
  • @emi 已发布。
  • 正确吗?我看到有一个/db_app/db_app 目录。
  • 您的应用需要任何数据库实例吗?

标签: docker flask docker-compose gunicorn google-cloud-run


【解决方案1】:

回答我自己的问题,因为我知道出了什么问题。

显然,Google Cloud Run 自己负责安全性,它不希望我们将任何自签名或以其他方式生成的证书与容器实例输出一起使用。为了安全起见,我还使用了默认端口。 从 Gunicorn 命令中删除有关它的行使其工作并正确响应客户端(仍与 https 连接)。

所以这是 Dockerfile 需要的唯一更改:

CMD exec gunicorn --bind 0.0.0.0:8080 --reload --workers=1 --threads 8 --timeout 0 "db_app.app:create_app()"

这里的底线是谷歌为此使用自己的证书,不需要我们的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-10-24
    • 2016-02-16
    • 1970-01-01
    • 1970-01-01
    • 2021-04-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多