docker - 构建派生图像时无法在缓存中找到(本地)图像
问题描述
新Mac上的错误
在全新的 Macbook(M1 Apple 芯片)上构建 Docker 映像时,我得到以下信息:
$ docker build -f Dockerfile-local-dev .
[+] Building 1.4s (3/3) FINISHED
=> [internal] load build definition from Dockerfile-local-dev 0.0s
=> => transferring dockerfile: 47B 0.0s
=> [internal] load .dockerignore 0.0s
=> => transferring context: 2B 0.0s
=> ERROR [internal] load metadata for docker.io/library/nicecorp-empty-db:latest 1.3s
------
> [internal] load metadata for docker.io/library/nicecorp-empty-db:latest:
------
failed to solve with frontend dockerfile.v0: failed to create LLB definition: pull access denied, repository does not exist or may require authorization: server message: insufficient_scope: authorization failed
这显然与拉取策略等有关,但它应该只找到一个本地图像并使用它,而不是尝试将其从全局 Docker 注册表中拉出......
在 Ubuntu 和其他 Mac 上没有错误!
奇怪的是,这适用于我所有其他机器,运行相同的 docker build(20.10.7,build f0df350)!
$ docker build -f Dockerfile-local-dev .
[+] Building 0.1s (8/8) FINISHED
=> [internal] load build definition from Dockerfile-local-dev 0.0s
=> => transferring dockerfile: 48B 0.0s
=> [internal] load .dockerignore 0.0s
=> => transferring context: 2B 0.0s
=> [internal] load metadata for docker.io/library/nicecorp-empty-db:latest 0.0s
=> [1/4] FROM docker.io/library/nicecorp-empty-db 0.0s
=> CACHED [2/4] RUN /etc/init.d/postgresql start && psql --command "CREATE DATABASE nicecorpdb_test_template OWNER nicecorpadmin;" && psql --command "ALTER USER nicecorpadmin SUPERUSER;" 0.0s
=> CACHED [3/4] RUN echo "host all all samenet password" >> /etc/postgresql/12/main/pg_hba.conf 0.0s
=> CACHED [4/4] RUN echo "max_connections = 1000" >> /etc/postgresql/12/main/postgresql.conf 0.0s
=> exporting to image 0.0s
=> => exporting layers 0.0s
=> => writing image sha256:06b87e72ee838bef04380d9668b4dca49efede61cf0888289a58544d1019ca1c
$ docker --version
Docker version 20.10.7, build f0df350
图像存在于本地缓存中
$ docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
nicecorp-empty-db latest 99c3d1659d80 20 minutes ago 393MB
在 Linux 机器(实际上是 WSL2)上对相同的代码和 Dockerfile 执行此操作时,效果非常好。与我的英特尔 iMac 相同,这可能是与 M1 芯片和 Docker 版本有关的一些错误吗?
Dockerfile-local-dev
文件:
$ cat Dockerfile-local-dev
# Most definitely not to be used in production!
FROM nicecorp-empty-db
MAINTAINER ACME <devs@ACME.com>
# Allow nicecorpadmin user to create and drop databases (used for test runs)
RUN /etc/init.d/postgresql start && \
psql --command "CREATE DATABASE nicecorpdb_test_template OWNER nicecorpadmin;" && \
psql --command "ALTER USER nicecorpadmin SUPERUSER;"
# Allow all users to connect to all databases (used for test runs to allow ad-hoc databases)
RUN echo "host all all samenet password" >> /etc/postgresql/12/main/pg_hba.conf
RUN echo "max_connections = 1000" >> /etc/postgresql/12/main/postgresql.conf
运行时找到图片
当我尝试运行它时,似乎可以找到本地图像 jsut:
$ docker run nimble-empty-db:latest
* Starting PostgreSQL 12 database server
...done.
2021-08-01 18:31:31.765 CEST [22] LOG: starting PostgreSQL 12.7 (Ubuntu 12.7-1.pgdg20.04+1) on aarch64-unknown-linux-gnu, compiled by gcc (Ubuntu 9.3.0-17ubuntu1~20.04) 9.3.0, 64-bit
2021-08-01 18:31:31.765 CEST [22] LOG: listening on IPv4 address "0.0.0.0", port 5432
解决方案
我遇到了类似的问题,发现这个 git 问题中的建议很有用:https ://github.com/docker/for-mac/issues/5419
添加--platform=linux/amd64
到我的FROM
命令为我解决了这个问题,所以在你的情况下,它将是:
FROM --platform=linux/amd64 nicecorp-empty-db
或者,可以设置export DOCKER_DEFAULT_PLATFORM=linux/amd64
以避免更改实际文件。事实上,对于有问题的 Ubuntu 映像,它确实存在于 ARM 平台上,因此也可以将其设置为linux/arm64
.
推荐阅读
- c# - 为什么图标不显示在工具栏中?
- javascript - 反应 Apexcharts 折线图线不可见
- c# - 将 HTML 元素传递给类函数
- flutter - 在颤动中,如何将 Firebase onAuthStateChanged 与 user.getTokenId()“合并”以返回 Stream?
- python - 在数据帧上应用 OneHotEncoder 时出现错误“传递值的形状为 (8708, 27),索引暗示 (8708, 4)”
- javascript - jQuery按钮在滚动时滑入和滑出
- ios - didEnterRegion 和 didExitRegion 没有被调用,但是 didStartMonitoringForRegion 在地理围栏中工作,objectiveC
- google-cloud-storage - 使用服务帐户 HMAC 密钥进行身份验证时的跨项目 ListBuckets
- firewall - Symfony 5:我可以在 security.yaml 中有主防火墙和管理防火墙吗?
- sql - PL/SQL 函数输入值似乎与函数输入参数不匹配