Docker-compose 错误 -- 恐慌:运行时错误:索引超出长度为 1 的范围 [1]

Bra*_*der 7 docker docker-compose


\n

我一直在尝试让 Docker 与 Postgres 和 Flask 一起使用,但我遇到了 Postgres 密码问题,并且 docker 无法找到我的 entry.sh 文件。这似乎是 docker 未正确更新的问题,但现在更新后,当我运行 docker-compose up 时,我收到“go”错误,我不知道它们是什么意思。

\n

这是错误日志:

\n
panic: runtime error: index out of range [1] with length 1\n\ngoroutine 37 [running]:\ngithub.com/docker/compose-cli/pkg/compose.(*convergence).ensureService(0xc00027ff20, 0x2120ba8, 0xc000454450, 0xc000240f00, 0xc0001ce7c8, 0x3, 0x0, 0x0, 0x0, 0xc000240a00, ...)\n        github.com/docker/compose-cli/pkg/compose/convergence.go:222 +0x11f1\ngithub.com/docker/compose-cli/pkg/compose.(*convergence).apply.func1(0x2120ba8, 0xc000454450, 0xc0001ce7c8, 0x3, 0x0, 0x0)\n        github.com/docker/compose-cli/pkg/compose/convergence.go:99 +0x21f\ngithub.com/docker/compose-cli/pkg/compose.run.func1(0x0, 0x0)\n        github.com/docker/compose-cli/pkg/compose/dependencies.go:102 +0xa3\ngolang.org/x/sync/errgroup.(*Group).Go.func1(0xc000590540, 0xc000626180)\n        golang.org/x/sync@v0.0.0-20210220032951-036812b2e83c/errgroup/errgroup.go:57 +0x59\ncreated by golang.org/x/sync/errgroup.(*Group).Go\n        golang.org/x/sync@v0.0.0-20210220032951-036812b2e83c/errgroup/errgroup.go:54 +0x66\n
Run Code Online (Sandbox Code Playgroud)\n

这是我的 docker-compose.yml:

\n
services:\n    api:\n      container_name: api\n      build:\n        context: .\n        dockerfile: api/Dockerfile.api\n      image: mutcompute-api\n      ports:\n        - "5000:5000"\n      volumes:\n        - ./api:/app/\n      env_file: \n        - ./api/.env\n      command: gunicorn -b 0.0.0.0:5000 api:app && flask db upgrade\n      # entrypoint: ["./api/entry.sh"]\n      depends_on:\n        - db\n    client:\n      container_name: client\n      build:\n        context: .\n        dockerfile: client/Dockerfile.client\n      image: mutcompute-client\n      ports:\n        - "3000:3000"\n      volumes:\n        - ./client:/app/\n    email:\n      container_name: email\n      build:\n        context: .\n        dockerfile: api/Dockerfile.api\n      image: mutcompute-api\n      ports:\n        - "8025:8025"\n      command: python -m smtpd -n -c DebuggingServer 0.0.0.0:8025 \n    db:\n      image: postgres:13-alpine\n      volumes:\n        - postgres_data:/var/lib/postgresql/data\n      environment:\n        POSTGRES_USER: mutcompute\n        POSTGRES_PASSWORD: mutcompute\n        POSTGRES_DB: mutcompute_dev\n      networks:\n        - default\n      ports:\n        - 5405:5432\n      restart: always\n      volumes:\n        - ./postgres-data:/var/lib/postgresql/data\n
Run Code Online (Sandbox Code Playgroud)\n

我的 Dockerfile:

\n
FROM python:slim\n\nLABEL maintainer="Brad Alexander"\n\nRUN useradd mutcompute\n\nWORKDIR /app\n\nCOPY . /app/\nCOPY entry.sh /app/\n\nENV FLASK_APP api.py\n\nRUN chown -R mutcompute:mutcompute /app && \\\n    # chmod +x ./entry.sh && \\\n    pip install -r requirements.txt\n\nUSER mutcompute\n\nEXPOSE 5000\n
Run Code Online (Sandbox Code Playgroud)\n

和一个粗略的文件树

\n
Project\n   |-api\n      |-app/\n      |-Dockerfile-api\n      |-entry.sh\n   |-client\n      |-src/\n      |-Dockerfile-client\n   |-Docker-compose.yml\n
Run Code Online (Sandbox Code Playgroud)\n

客户端是React,更新前运行良好。

\n

有时,当我编辑 compose 文件时,它开始重新创建 api 容器,然后失败,如下所示:

\n
\xe2\xa0\x99 Container api               Recreate                                                                                                                                                       0.2s\n \xe2\xa0\x99 Container bb72362b9e19_api  Recreate                                                                                                                                                       0.2s\npanic: runtime error: index out of range [1] with length 1\n...\n
Run Code Online (Sandbox Code Playgroud)\n

希望这是足够的信息。我真的很感谢任何帮助!

\n

Bra*_*der 10

TLDR:我想我在后台有绑定端口的容器。

简单修复:

docker-compose up --remove-orphans // not sure if this step is necessary
docker-compose down
docker-compose up
Run Code Online (Sandbox Code Playgroud)

我实际上是如何修复它的:

我切换到没有数据库服务的先前版本,并提示运行docker-compose --remove -orphans,这并没有多大作用。在搜索 GitHub 问题后,发现大多数问题都与副本相关,我决定到底是什么,并向 api 服务添加了副本部分。虽然这个错误与副本无关,但我得到了一个不同的错误:

警告:“api”服务正在使用自定义容器名称“api”。Docker 要求每个容器都有一个唯一的名称。删除自定义名称以扩展服务。

对于这个错误,我只是注释掉了每个服务中的所有container_name部分,并得到了一个新错误:

来自守护程序的错误响应:驱动程序在端点 <...> 上编程外部连接失败:绑定 0.0.0.0:5000 失败:端口已分配

繁荣!这是真正的问题。搜索了这个,发现我只需要运行docker-compose down

当我切换回带有数据库服务的分支时,一切正常!