运行 docker 时无法将“app.server”解析为属性名称或函数调用

rmb*_*rmb 6 python docker dockerfile docker-compose plotly-dash

我正在尝试从 docker 运行我的应用程序,但我收到了来自docker logs破折号的错误消息。我搜索了很多但找不到任何东西。请帮忙!

docker logs来自破折号图像的日志消息

[2020-08-22 06:44:32 +0000] [1] [INFO] Starting gunicorn 20.0.4
[2020-08-22 06:44:32 +0000] [1] [INFO] Listening at: http://0.0.0.0:8050 (1)
[2020-08-22 06:44:32 +0000] [1] [INFO] Using worker: sync
[2020-08-22 06:44:32 +0000] [8] [INFO] Booting worker with pid: 8
Failed to parse 'app.server' as an attribute name or function call.
[2020-08-22 06:44:33 +0000] [8] [INFO] Worker exiting (pid: 8)
[2020-08-22 06:44:33 +0000] [1] [INFO] Shutting down: Master
[2020-08-22 06:44:33 +0000] [1] [INFO] Reason: App failed to load.
Run Code Online (Sandbox Code Playgroud)

我的 API 工作正常

[2020-08-22 06:44:31 +0000] [1] [INFO] Starting gunicorn 20.0.4
[2020-08-22 06:44:31 +0000] [1] [INFO] Listening at: http://0.0.0.0:5000 (1)
[2020-08-22 06:44:31 +0000] [1] [INFO] Using worker: sync
[2020-08-22 06:44:31 +0000] [8] [INFO] Booting worker with pid: 8
Run Code Online (Sandbox Code Playgroud)

这是我的 Dash 应用程序。文件名位于文件夹app.pydash

app = dash.Dash(
    __name__,
    external_stylesheets=external_stylesheets,
    meta_tags=[
        {"name": "viewport", "content": "width=device-width, initial-scale=1"}
    ],
    suppress_callback_exceptions=True
)

if __name__ == '__main__':
    ENVIRONMENT = os.environ.get("ENVIRONMENT", "dev")
    DEBUG = ENVRIONMENT == "dev"
    HOST = '0.0.0.0' if ENVIRONMENT == "prod" else 'localhost'
    app.run_server(debug=DEBUG, host=HOST)
Run Code Online (Sandbox Code Playgroud)

这是我Dockerfile的 Dash

FROM python:3.7

ADD requirements.txt /app/
WORKDIR /app
RUN pip install -r requirements.txt

ADD . /app

EXPOSE 8050

CMD ["gunicorn", "-b", "0.0.0.0:8050", "app:app.server"]
Run Code Online (Sandbox Code Playgroud)

这是我的docker-compose.yml文件

version: '3'
services:
  api:
    build:
      context: src/api
      dockerfile: Dockerfile
    environment:
      - ENVIRONMENT=prod
    restart: always
  dash:
    build:
      context: src/dash
      dockerfile: Dockerfile
    ports:
      - "8050:8050"
    environment:
      - ENVIRONMENT=prod
      - API_URL=http://api:5000/api
    depends_on:
      - api
    restart: always
Run Code Online (Sandbox Code Playgroud)

这是我的 api 代码作为文件夹app.py中的文件api

app = Flask(__name__)
api = Blueprint('api', __name__)

app.register_blueprint(api, url_prefix='/api')

if __name__ == "__main__":
    ENVIRONMENT = os.environ.get("ENVIRONMENT", "dev")
    DEBUG = ENVIRONMENT == "dev"
    HOST = '0.0.0.0' if ENVIRONMENT == "prod" else 'localhost'
    app.run(debug=DEBUG, host=HOST)
Run Code Online (Sandbox Code Playgroud)

这是我Dockerfile的 api

FROM python:3.7

ADD requirements.txt /app/
WORKDIR /app

RUN pip install -r requirements.txt

ADD . /app

EXPOSE 5000

CMD ["gunicorn", "-b", "0.0.0.0:5000", "app:app"]
Run Code Online (Sandbox Code Playgroud)

这是我跑步后得到的docker-compose up --build -d

Step 5/7 : ADD . /app
 ---> 5f1b89f2daeb
Step 6/7 : EXPOSE 5000
 ---> Running in 74a03831d03e
Removing intermediate container 74a03831d03e
 ---> cab01af5bfee
Step 7/7 : CMD ["gunicorn", "-b", "0.0.0.0:5000", "app:app"]
 ---> Running in 606197aae6fd
Removing intermediate container 606197aae6fd
 ---> 35be6754e766
Successfully built 35be6754e766
Successfully tagged appname_api:latest
Building dash
.
.
.

Step 5/7 : ADD . /app
 ---> c1111dca7a60
Step 6/7 : EXPOSE 8050
 ---> Running in ef1a216db216
Removing intermediate container ef1a216db216
 ---> a84d1d8ce503
Step 7/7 : CMD ["gunicorn", "-b", "0.0.0.0:8050", "app:app.server"]
 ---> Running in afc121660ddc
Removing intermediate container afc121660ddc
 ---> 600011a005ca
Successfully built 600011a005ca
Successfully tagged appname_dash:latest
Creating appname_api_1 ... done
Creating appname_dash_1 ... done
Run Code Online (Sandbox Code Playgroud)

Sco*_*ter 6

我在同事的应用程序中修复了此错误,其中有以下内容app.py

server = Flask(__name__) # define flask app.server
app = dash.Dash(
    __name__,
    server=server,
)
Run Code Online (Sandbox Code Playgroud)

然后index.py他们正在做:

from app import app

server = app.server # I add this part here
Run Code Online (Sandbox Code Playgroud)

然后 Docker CMD 是:

CMD ["gunicorn", "index:server", "-b", ":8050"]
Run Code Online (Sandbox Code Playgroud)

它奏效了。


ker*_*baz 4

问题在于您传递给gunicorn 的参数。根据您在此处显示的内容,我建议您尝试更改:

CMD ["gunicorn", "-b", "0.0.0.0:8050", "app:app.server"]到:

CMD ["gunicorn", "-b", "0.0.0.0:8050", "app:server"]