目前我正在使用
docker run
命令运行 docker 容器,我发现了 vscode 容器,看起来很有趣。我创建了一个工作区和一个 devcontainer.json
。
devcontainer.json
{
"name": "dev",
"image": "demo:focal",
"containerUser": "root",
"runArgs": [
"--cap-add=SYS_PTRACE",
"--security-opt",
"seccomp=unconfined",
"--security-opt",
"apparmor=unconfined",
"--network=host",
"--privileged"
]
}
我已经构建了 dockerimage,并且不想再次重建。所以我在 json 文件中使用 docker 镜像名称。但是在打开容器时,我收到以下错误:
=> ERROR [internal] load metadata for docker.io/library/demo:f 1.4s
=> [context dev_containers_feature_content_source] load .dockerignore 0.0s
=> => transferring dev_containers_feature_content_source: 2B 0.0s
------
> [internal] load metadata for docker.io/library/demo:focal:
------
[2022-10-27T06:53:02.045Z] Dockerfile.extended:8
--------------------
6 |
7 |
8 | >>> FROM $_DEV_CONTAINERS_BASE_IMAGE AS dev_containers_target_stage
9 |
10 | USER root
--------------------
ERROR: failed to solve: pull access denied, repository does not exist or may require authorization: server message: insufficient_scope: authorization failed
[2022-10-27T06:53:02.053Z] Stop (2681 ms): Run: docker buildx build --load --build-context dev_containers_feature_content_source=/tmp/devcontainercli-user_s/container-features/0.20.0-1666853579352
[2022-10-27T06:53:02.053Z] Error: Command failed: docker buildx build --load --build-context dev_containers_feature_content_source=/tmp/devcontainercli-user_s/container-features/0.20.0-1666853579352]
我可以使用
docker run
命令运行相同的映像,但无法找到开发容器的问题是什么?
我之前也遇到过同样的问题。
要解决这个问题,你应该使用
F1 > Dev Containers: Rebuild Container
而不是 F1 > Dev Containers: Rebuild Container Without Cache
。
然后就应该可以使用本地镜像了。在我的本地测试过并且工作正常。
您的具体错误是:
=> ERROR [internal] load metadata for docker.io/library/demo:f 1.4s
[...]
ERROR: failed to solve: pull access denied, repository does not exist or may require authorization: server message: insufficient_scope: authorization failed
您的 docker 本地映像缓存中实际上并没有
demo:focal
映像,这就是这个意思,您可能将其命名为略有不同。
VSCode 只是使用
docker
(显然基于您的 VSCode 设置配置)在此处隐式构建图像,因此它临时构建一个以 FROM ${image}
开头的 Dockerfile,然后将其传递给 docker buildx build
。
您所看到的是
docker
检查本地图像缓存中的 demo:focal
,没有找到具有确切名称和版本的图像,对不以 URL+路径开头的图像名称使用回退行为并添加默认的 docker.io/library/
到名称中,仍然在本地图像缓存中找不到 docker.io/library/demo:focal
,然后尝试从注册表中获取图像,因为本地图像缓存中缺少该图像。由于您的图像名称没有能够拉取所需的注册表 URL,因此它使用内置后备行为并添加 docker.io/library/
,然后尝试从 docker.io/library/demo:focal
拉取。
如果您尝试执行
docker.io
,显然 docker pull docker.io/library/demo:focal
注册表将返回“访问被拒绝”错误。
因此要解决此问题,您需要:
docker image ls
结果中显示出完全相同的名称)devcontainer.json
中为 "image"
字段使用相同的匹配名称。