首页 > 解决方案 > RaspberryPI 上的 Docker 不安装 Pyyaml

问题描述

尝试构建 docker-image 时出现以下错误。

Step 5/5 : RUN pip install -r requirements.txt
 ---> Running in e439307defa3
Collecting wakeonlan
  Downloading wakeonlan-2.0.1-py3-none-any.whl (4.2 kB)
Collecting pyyaml
  Downloading PyYAML-5.4.1.tar.gz (175 kB)
ERROR: Exception:
Traceback (most recent call last):
  File "/usr/local/lib/python3.9/tarfile.py", line 2301, in utime
    os.utime(targetpath, (tarinfo.mtime, tarinfo.mtime))
PermissionError: [Errno 1] Operation not permitted

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/usr/local/lib/python3.9/site-packages/pip/_internal/cli/base_command.py", line 173, in _main
    status = self.run(options, args)
  File "/usr/local/lib/python3.9/site-packages/pip/_internal/cli/req_command.py", line 203, in wrapper
    return func(self, options, args)
  File "/usr/local/lib/python3.9/site-packages/pip/_internal/commands/install.py", line 315, in run
    requirement_set = resolver.resolve(
  File "/usr/local/lib/python3.9/site-packages/pip/_internal/resolution/resolvelib/resolver.py", line 94, in resolve
    result = self._result = resolver.resolve(
  File "/usr/local/lib/python3.9/site-packages/pip/_vendor/resolvelib/resolvers.py", line 472, in resolve
    state = resolution.resolve(requirements, max_rounds=max_rounds)
  File "/usr/local/lib/python3.9/site-packages/pip/_vendor/resolvelib/resolvers.py", line 341, in resolve
    self._add_to_criteria(self.state.criteria, r, parent=None)
  File "/usr/local/lib/python3.9/site-packages/pip/_vendor/resolvelib/resolvers.py", line 172, in _add_to_criteria
    if not criterion.candidates:
  File "/usr/local/lib/python3.9/site-packages/pip/_vendor/resolvelib/structs.py", line 151, in __bool__
    return bool(self._sequence)
  File "/usr/local/lib/python3.9/site-packages/pip/_internal/resolution/resolvelib/found_candidates.py", line 140, in __bool__
    return any(self)
  File "/usr/local/lib/python3.9/site-packages/pip/_internal/resolution/resolvelib/found_candidates.py", line 128, in <genexpr>
    return (c for c in iterator if id(c) not in self._incompatible_ids)
  File "/usr/local/lib/python3.9/site-packages/pip/_internal/resolution/resolvelib/found_candidates.py", line 32, in _iter_built
    candidate = func()
  File "/usr/local/lib/python3.9/site-packages/pip/_internal/resolution/resolvelib/factory.py", line 204, in _make_candidate_from_link
    self._link_candidate_cache[link] = LinkCandidate(
  File "/usr/local/lib/python3.9/site-packages/pip/_internal/resolution/resolvelib/candidates.py", line 295, in __init__
    super().__init__(
  File "/usr/local/lib/python3.9/site-packages/pip/_internal/resolution/resolvelib/candidates.py", line 156, in __init__
    self.dist = self._prepare()
  File "/usr/local/lib/python3.9/site-packages/pip/_internal/resolution/resolvelib/candidates.py", line 227, in _prepare
    dist = self._prepare_distribution()
  File "/usr/local/lib/python3.9/site-packages/pip/_internal/resolution/resolvelib/candidates.py", line 305, in _prepare_distribution
    return self._factory.preparer.prepare_linked_requirement(
  File "/usr/local/lib/python3.9/site-packages/pip/_internal/operations/prepare.py", line 508, in prepare_linked_requirement
    return self._prepare_linked_requirement(req, parallel_builds)
  File "/usr/local/lib/python3.9/site-packages/pip/_internal/operations/prepare.py", line 550, in _prepare_linked_requirement
    local_file = unpack_url(
  File "/usr/local/lib/python3.9/site-packages/pip/_internal/operations/prepare.py", line 249, in unpack_url
    unpack_file(file.path, location, file.content_type)
  File "/usr/local/lib/python3.9/site-packages/pip/_internal/utils/unpacking.py", line 256, in unpack_file
    untar_file(filename, location)
  File "/usr/local/lib/python3.9/site-packages/pip/_internal/utils/unpacking.py", line 230, in untar_file
    tar.utime(member, path)
  File "/usr/local/lib/python3.9/tarfile.py", line 2303, in utime
    raise ExtractError("could not change modification time")
tarfile.ExtractError: could not change modification time
The command '/bin/sh -c pip install -r requirements.txt' returned a non-zero code: 2

码头工人文件

FROM python:3
WORKDIR /usr/src/wakeonlan
COPY . .
RUN pip install --no-cache-dir --upgrade pip
# Install dependeces
RUN pip install -r requirements.txt

requirements.txt 包括pyyamlwakeonlan

主机操作系统:

PRETTY_NAME="Raspbian GNU/Linux 10 (buster)"
NAME="Raspbian GNU/Linux"
VERSION_ID="10"
VERSION="10 (buster)"
VERSION_CODENAME=buster

码头工人版本

Client: Docker Engine - Community
 Version:           20.10.8
 API version:       1.41
 Go version:        go1.16.6
 Git commit:        3967b7d
 Built:             Fri Jul 30 19:55:38 2021
 OS/Arch:           linux/arm
 Context:           default
 Experimental:      true

Server: Docker Engine - Community
 Engine:
  Version:          20.10.8
  API version:      1.41 (minimum version 1.12)
  Go version:       go1.16.6
  Git commit:       75249d8
  Built:            Fri Jul 30 19:53:31 2021
  OS/Arch:          linux/arm
  Experimental:     false
 containerd:
  Version:          1.4.8
  GitCommit:        7eba5930496d9bbe375fdf71603e610ad737d2b2
 runc:
  Version:          1.0.0
  GitCommit:        v1.0.0-0-g84113ee
 docker-init:
  Version:          0.19.0
  GitCommit:        de40ad0

我尝试重新安装 docker 并删除缓存的图像。问题只发生在树莓上。在 Windows 和 Ubuntu-VM 上,可以毫无问题地构建映像。

标签: dockerraspberry-piraspbian-buster

解决方案


这里同样的问题。

我刚刚将一些 dockerized python 应用程序从 Ubuntu 服务器迁移到 Raspberry,我不得不更改每个 Dockerfile 以使用“-buster”版本。

FROM python:3-buster #python:buster also works
...

为什么?我仍然不知道,但我试过这个(因为当我安装树莓操作系统时,我已经读过很多次 buster)并且它有效。


推荐阅读