root@iZbp12r139zzzpzpwtqtqyZ:~/work/edu-webrtc-server-signaling# docker compose build
[+] Building 529.8s (9/9) FINISHED docker:default
=> [fastapi internal] load build definition from Dockerfile 0.0s
=> => transferring dockerfile: 425B 0.0s
=> [fastapi internal] load metadata for docker.io/library/python:3.10 3.3s
=> [fastapi internal] load .dockerignore 0.0s
=> => transferring context: 2B 0.0s
=> [fastapi 1/5] FROM docker.io/library/python:3.10@sha256:fd0fa50d997eb56ce560c6e5ca6a1f5cf8fdff87572a16ac07fb1f5ca 256.3s
=> => resolve docker.io/library/python:3.10@sha256:fd0fa50d997eb56ce560c6e5ca6a1f5cf8fdff87572a16ac07fb1f5ca01eb608 0.0s
=> => sha256:3b9d6bd35f8ef7d0697e7b08d1f5c781e488d3c8d1df3338b03bc22be44514d6 2.33kB / 2.33kB 0.0s
=> => sha256:7d98d813d54f6207a57721008a4081378343ad8f1b2db66c121406019171805b 49.56MB / 49.56MB 50.5s
=> => sha256:da802df85c965baeca9d39869f9e2cbb3dc844d4627f413bfbb2f2c3d6055988 24.05MB / 24.05MB 23.3s
=> => sha256:7aadc5092c3b7a865666b14bef3d4d038282b19b124542f1a158c98ea8c1ed1b 64.39MB / 64.39MB 65.9s
=> => sha256:fd0fa50d997eb56ce560c6e5ca6a1f5cf8fdff87572a16ac07fb1f5ca01eb608 9.08kB / 9.08kB 0.0s
=> => sha256:9ec1cdbafe6e73e1c44c39ee914db2553cc367cbfdf215429bac3133b2c11778 6.32kB / 6.32kB 0.0s
=> => sha256:ad1c7cfc347f5c86fc2678b58f6a8fb6c6003471405760532fc3240b9eb1b343 211.27MB / 211.27MB 242.4s
=> => sha256:4d508a9407359de608ead2a7e385506c4cb830d0e6937bc10caabb98da682c7c 6.16MB / 6.16MB 55.9s
=> => extracting sha256:7d98d813d54f6207a57721008a4081378343ad8f1b2db66c121406019171805b 2.7s
=> => extracting sha256:da802df85c965baeca9d39869f9e2cbb3dc844d4627f413bfbb2f2c3d6055988 0.8s
=> => sha256:60ed5086cc45cf232728d1d4f1d59871dbf5e98b2f622b2918d6ab45c88de5c8 21.38MB / 21.38MB 77.6s
=> => extracting sha256:7aadc5092c3b7a865666b14bef3d4d038282b19b124542f1a158c98ea8c1ed1b 3.4s
=> => sha256:0a52f5c07e30cfc04c0209bdd45963b9b55d65e569d2bb91ab5cfe772ae63f87 250B / 250B 66.0s
=> => extracting sha256:ad1c7cfc347f5c86fc2678b58f6a8fb6c6003471405760532fc3240b9eb1b343 8.9s
=> => extracting sha256:4d508a9407359de608ead2a7e385506c4cb830d0e6937bc10caabb98da682c7c 0.4s
=> => extracting sha256:60ed5086cc45cf232728d1d4f1d59871dbf5e98b2f622b2918d6ab45c88de5c8 1.1s
=> => extracting sha256:0a52f5c07e30cfc04c0209bdd45963b9b55d65e569d2bb91ab5cfe772ae63f87 0.0s
=> [fastapi internal] load build context 0.1s
=> => transferring context: 13.81kB 0.0s
=> [fastapi 2/5] WORKDIR /app 2.9s
=> [fastapi 3/5] COPY . . 0.1s
=> [fastapi 4/5] RUN pip install --no-cache-dir --upgrade pip 264.0s
=> ERROR [fastapi 5/5] RUN pip install --no-cache-dir -r requirements.txt 3.0s
------
> [fastapi 5/5] RUN pip install --no-cache-dir -r requirements.txt:
2.883 ERROR: Could not open requirements file: [Errno 2] No such file or directory: 'requirements.txt'
------
failed to solve: process "/bin/sh -c pip install --no-cache-dir -r requirements.txt" did not complete successfully: exit code: 1
root@iZbp12r139zzzpzpwtqtqyZ:~/work/edu-webrtc-server-signaling# docker compose build
[+] Building 74.9s (8/9) docker:default
=> [fastapi internal] load build definition from Dockerfile 0.0s
=> => transferring dockerfile: 425B 0.0s
=> [fastapi internal] load metadata for docker.io/library/python:3.10 1.3s
=> [fastapi internal] load .dockerignore 0.0s
=> => transferring context: 2B 0.0s
=> [fastapi 1/5] FROM docker.io/library/python:3.10@sha256:fd0fa50d997eb56ce560c6e5ca6a1f5cf8fdff87572a16ac07fb1f5ca01 0.0s
=> [fastapi internal] load build context 0.0s
=> => transferring context: 3.90kB 0.0s
=> CACHED [fastapi 2/5] WORKDIR /app 0.0s
=> [fastapi 3/5] COPY . . 0.1s
=> ERROR [fastapi 4/5] RUN pip install --no-cache-dir --upgrade pip 73.4s
------
> [fastapi 4/5] RUN pip install --no-cache-dir --upgrade pip:
2.000 Requirement already satisfied: pip in /usr/local/lib/python3.10/site-packages (23.0.1)
2.863 Collecting pip
3.514 Downloading pip-24.2-py3-none-any.whl (1.8 MB)
67.54 ━━━━━━━━━━━ 0.5/1.8 MB 10.6 kB/s eta 0:02:04
67.55 ERROR: Exception:
67.55 Traceback (most recent call last):
67.55 File "/usr/local/lib/python3.10/site-packages/pip/_vendor/urllib3/response.py", line 438, in _error_catcher
67.55 yield
67.55 File "/usr/local/lib/python3.10/site-packages/pip/_vendor/urllib3/response.py", line 561, in read
67.55 data = self._fp_read(amt) if not fp_closed else b""
67.55 File "/usr/local/lib/python3.10/site-packages/pip/_vendor/urllib3/response.py", line 527, in _fp_read
67.55 return self._fp.read(amt) if amt is not None else self._fp.read()
67.55 File "/usr/local/lib/python3.10/http/client.py", line 466, in read
67.55 s = self.fp.read(amt)
67.55 File "/usr/local/lib/python3.10/socket.py", line 717, in readinto
67.55 return self._sock.recv_into(b)
67.55 File "/usr/local/lib/python3.10/ssl.py", line 1307, in recv_into
67.55 return self.read(nbytes, buffer)
67.55 File "/usr/local/lib/python3.10/ssl.py", line 1163, in read
67.55 return self._sslobj.read(len, buffer)
67.55 TimeoutError: The read operation timed out
67.55
67.55 During handling of the above exception, another exception occurred:
67.55
67.55 Traceback (most recent call last):
67.55 File "/usr/local/lib/python3.10/site-packages/pip/_internal/cli/base_command.py", line 160, in exc_logging_wrapper
67.55 status = run_func(*args)
67.55 File "/usr/local/lib/python3.10/site-packages/pip/_internal/cli/req_command.py", line 247, in wrapper
67.55 return func(self, options, args)
67.55 File "/usr/local/lib/python3.10/site-packages/pip/_internal/commands/install.py", line 419, in run
67.55 requirement_set = resolver.resolve(
67.55 File "/usr/local/lib/python3.10/site-packages/pip/_internal/resolution/resolvelib/resolver.py", line 92, in resolve
67.55 result = self._result = resolver.resolve(
67.55 File "/usr/local/lib/python3.10/site-packages/pip/_vendor/resolvelib/resolvers.py", line 481, in resolve
67.55 state = resolution.resolve(requirements, max_rounds=max_rounds)
67.55 File "/usr/local/lib/python3.10/site-packages/pip/_vendor/resolvelib/resolvers.py", line 348, in resolve
67.55 self._add_to_criteria(self.state.criteria, r, parent=None)
67.55 File "/usr/local/lib/python3.10/site-packages/pip/_vendor/resolvelib/resolvers.py", line 172, in _add_to_criteria
67.55 if not criterion.candidates:
67.55 File "/usr/local/lib/python3.10/site-packages/pip/_vendor/resolvelib/structs.py", line 151, in __bool__
67.55 return bool(self._sequence)
67.55 File "/usr/local/lib/python3.10/site-packages/pip/_internal/resolution/resolvelib/found_candidates.py", line 155, in __bool__
67.55 return any(self)
67.55 File "/usr/local/lib/python3.10/site-packages/pip/_internal/resolution/resolvelib/found_candidates.py", line 143, in <genexpr>
67.55 return (c for c in iterator if id(c) not in self._incompatible_ids)
67.55 File "/usr/local/lib/python3.10/site-packages/pip/_internal/resolution/resolvelib/found_candidates.py", line 97, in _iter_built_with_inserted
67.55 candidate = func()
67.55 File "/usr/local/lib/python3.10/site-packages/pip/_internal/resolution/resolvelib/factory.py", line 206, in _make_candidate_from_link
67.55 self._link_candidate_cache[link] = LinkCandidate(
67.55 File "/usr/local/lib/python3.10/site-packages/pip/_internal/resolution/resolvelib/candidates.py", line 297, in __init__
67.55 super().__init__(
67.55 File "/usr/local/lib/python3.10/site-packages/pip/_internal/resolution/resolvelib/candidates.py", line 162, in __init__
67.55 self.dist = self._prepare()
67.55 File "/usr/local/lib/python3.10/site-packages/pip/_internal/resolution/resolvelib/candidates.py", line 231, in _prepare
67.55 dist = self._prepare_distribution()
67.55 File "/usr/local/lib/python3.10/site-packages/pip/_internal/resolution/resolvelib/candidates.py", line 308, in _prepare_distribution
67.55 return preparer.prepare_linked_requirement(self._ireq, parallel_builds=True)
67.55 File "/usr/local/lib/python3.10/site-packages/pip/_internal/operations/prepare.py", line 491, in prepare_linked_requirement
67.55 return self._prepare_linked_requirement(req, parallel_builds)
67.55 File "/usr/local/lib/python3.10/site-packages/pip/_internal/operations/prepare.py", line 536, in _prepare_linked_requirement
67.55 local_file = unpack_url(
67.55 File "/usr/local/lib/python3.10/site-packages/pip/_internal/operations/prepare.py", line 166, in unpack_url
67.55 file = get_http_url(
67.55 File "/usr/local/lib/python3.10/site-packages/pip/_internal/operations/prepare.py", line 107, in get_http_url
67.55 from_path, content_type = download(link, temp_dir.path)
67.55 File "/usr/local/lib/python3.10/site-packages/pip/_internal/network/download.py", line 147, in __call__
67.55 for chunk in chunks:
67.55 File "/usr/local/lib/python3.10/site-packages/pip/_internal/cli/progress_bars.py", line 53, in _rich_progress_bar
67.55 for chunk in iterable:
67.55 File "/usr/local/lib/python3.10/site-packages/pip/_internal/network/utils.py", line 63, in response_chunks
67.55 for chunk in response.raw.stream(
67.55 File "/usr/local/lib/python3.10/site-packages/pip/_vendor/urllib3/response.py", line 622, in stream
67.55 data = self.read(amt=amt, decode_content=decode_content)
67.55 File "/usr/local/lib/python3.10/site-packages/pip/_vendor/urllib3/response.py", line 560, in read
67.55 with self._error_catcher():
67.55 File "/usr/local/lib/python3.10/contextlib.py", line 153, in __exit__
67.55 self.gen.throw(typ, value, traceback)
67.55 File "/usr/local/lib/python3.10/site-packages/pip/_vendor/urllib3/response.py", line 443, in _error_catcher
67.55 raise ReadTimeoutError(self._pool, None, "Read timed out.")
67.55 pip._vendor.urllib3.exceptions.ReadTimeoutError: HTTPSConnectionPool(host='files.pythonhosted.org', port=443): Read timed out.
73.15
73.15 [notice] A new release of pip is available: 23.0.1 -> 24.2
73.15 [notice] To update, run: pip install --upgrade pip
------
failed to solve: process "/bin/sh -c pip install --no-cache-dir --upgrade pip" did not complete successfully: exit code: 2
root@iZbp12r139zzzpzpwtqtqyZ:~/work/edu-webrtc-server-signaling#
这个错误主要有两个方面的问题:一个是缺少 requirements.txt
文件导致的构建失败,另一个是由于网络连接问题导致 pip
安装超时。以下是解决方法:
1. 确保 requirements.txt
文件存在
Dockerfile
中包含了以下命令:
RUN pip install --no-cache-dir -r requirements.txt
这表示 requirements.txt
文件需要在项目根目录下存在。如果没有该文件,请确保创建并包含所有依赖库。例如,创建一个 requirements.txt
文件,内容如下:
fastapi
uvicorn
httpx
将这个文件保存在项目的根目录下,再次尝试构建。
2. 解决 pip
安装的网络超时问题
由于网络问题,pip
可能无法从官方的 files.pythonhosted.org
下载包,可以尝试使用国内的镜像源来加速 pip
安装。你可以在 Dockerfile 中添加使用镜像源的配置:
RUN pip install --no-cache-dir --upgrade pip -i https://pypi.tuna.tsinghua.edu.cn/simple
RUN pip install --no-cache-dir -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple
或者使用阿里云的镜像:
RUN pip install --no-cache-dir --upgrade pip -i https://mirrors.aliyun.com/pypi/simple/
RUN pip install --no-cache-dir -r requirements.txt -i https://mirrors.aliyun.com/pypi/simple/
3. 增加 pip
超时时间
你还可以在 pip
安装时增加超时时间,避免网络问题导致安装失败。例如:
RUN pip install --no-cache-dir --upgrade pip --default-timeout=100 -i https://pypi.tuna.tsinghua.edu.cn/simple
RUN pip install --no-cache-dir -r requirements.txt --default-timeout=100 -i https://pypi.tuna.tsinghua.edu.cn/simple
4. 完整的 Dockerfile
示例
下面是一个完整的 Dockerfile
示例,结合了上面所有的建议:
# 使用官方 Python 镜像作为基础镜像
FROM python:3.10
# 设置工作目录
WORKDIR /app
# 复制项目文件到工作目录
COPY . .
# 使用国内镜像源并增加超时时间,安装最新的 pip
RUN pip install --no-cache-dir --upgrade pip --default-timeout=100 -i https://pypi.tuna.tsinghua.edu.cn/simple
# 安装项目依赖
RUN pip install --no-cache-dir -r requirements.txt --default-timeout=100 -i https://pypi.tuna.tsinghua.edu.cn/simple
# 暴露端口
EXPOSE 8000
# 运行命令
CMD ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "8000"]
5. 检查网络设置
确保你的服务器能够访问外部网络,特别是访问 https://pypi.org
和 https://files.pythonhosted.org
。如果需要配置代理或者有防火墙限制,可以根据情况调整服务器的网络配置。
6. 重新构建镜像
在修改 Dockerfile
和 requirements.txt
文件后,再次运行构建命令:
docker compose build
这样应该能够解决因网络超时和文件缺失导致的构建错误。如果问题依旧存在,请检查是否有更深层次的网络问题或代理设置。