【问题标题】:Docker - no matching manifest for docker-compose build but docker build works when using non-default docker contextDocker - docker-compose build 没有匹配的清单,但 docker build 在使用非默认 docker 上下文时有效
【发布时间】:2020-05-11 16:02:41
【问题描述】:

在使用非默认 docker 上下文时,我在通过 docker-compose build 而不是通过 docker build 构建时遇到问题。难道我做错了什么?还是 docker-compose 不能正确支持上下文...或者?

我在具有两个 docker 上下文的 mac 上运行,default 上下文是指运行 linux 的标准 vm,而第二个上下文是 windows 服务器 virtualbox vm。 (我也喜欢用剪刀跑步……)

我有一个Dockerfile,它来自 Windows 图像。 docker build . 在使用 windows 上下文时工作正常。 我创建了一个docker-compose.yml 文件,它试图引用该Dockerfile 来构建。 docker-compose build 失败并出现错误“没有匹配的清单”。无论我身处何种环境,这都是正确的。

这里是Dockerfile

FROM mcr.microsoft.com/dotnet/framework/samples:aspnetapp

在父目录中,docker-compose.yml 文件:

version: '3.7'

services:

  web:
    build:
      context: ./web

还有docker build .docker-compose builddocker versiondocker context ls的输出

11:52:42 ~/proj/k/docker/web (master) $ docker build .
Sending build context to Docker daemon  2.048kB
Step 1/1 : FROM mcr.microsoft.com/dotnet/framework/samples:aspnetapp
 ---> bd698e59f147
Successfully built bd698e59f147
11:52:45 ~/proj/k/docker/web (master) $ cd ..
11:56:38 ~/proj/k/docker (master) $ docker-compose build
Building web
Step 1/1 : FROM mcr.microsoft.com/dotnet/framework/samples:aspnetapp
aspnetapp: Pulling from dotnet/framework/samples
ERROR: Service 'web' failed to build: no matching manifest for linux/amd64 in the manifest list entries
11:56:43 ~/proj/k/docker (master) $ docker version
Client: Docker Engine - Community
 Version:           19.03.5
 API version:       1.40
 Go version:        go1.12.12
 Git commit:        633a0ea
 Built:             Wed Nov 13 07:22:34 2019
 OS/Arch:           darwin/amd64
 Experimental:      false

Server: Docker Engine - Enterprise
 Engine:
  Version:          19.03.5
  API version:      1.40 (minimum version 1.24)
  Go version:       go1.12.12
  Git commit:       2ee0c57608
  Built:            11/13/2019 07:58:51
  OS/Arch:          windows/amd64
  Experimental:     false
11:56:49 ~/proj/k/docker (master) $ docker context ls
NAME                DESCRIPTION                               DOCKER ENDPOINT               KUBERNETES ENDPOINT   ORCHESTRATOR
2019-box *          2019-box windows-docker-machine           tcp://192.168.99.90:2376                            
default             Current DOCKER_HOST based configuration   unix:///var/run/docker.sock                         swarm
11:56:52 ~/proj/k/docker (master) $ 

【问题讨论】:

  • 您如何控制docker-compose 正在使用您的两个 Docker 上下文中的哪一个?
  • 我“假设” docker-compose 知道使用当前的 docker 上下文。但也许这就是问题所在?我应该如何为撰写指定非默认上下文?

标签: docker docker-compose


【解决方案1】:

我怀疑——但我不确定——docker-compose 对“上下文”一无所知。这意味着您可以通过设置 DOCKER_HOST 环境变量(docker 客户端也可以理解)来控制要使用的 Docker 实例。

与远程(网络连接)主机通信:

export DOCKER_HOST=tcp://hostname:port

与 Unix 套接字通信:

export DOCKER_HOST=unix:///var/run/docker.sock

要让 docker 使用 https 而不是 http,请设置 DOCKER_TLS_VERIFY 变量:

export DOCKER_TLS_VERIFY=1

有关这些变量的一些文档,请参阅“Protect the Docker daemon socket”。

【讨论】:

  • Thx,@larsks ...我认为您可能在正确的轨道上,但将 DOCKER_HOST 设置为docker context 显示的端点(在我的情况下,tcp://192.168.99.90:2376 如上所述)会产生来自@ 的错误987654333@:“来自守护程序的错误响应:客户端向 HTTPS 服务器发送了 HTTP 请求。”关于如何确定DOCKER_HOST 的价值的任何想法?
  • 嗨@larsks - 谢谢你的想法!试过这个......如果DOCKER_TLS_VERIFY 完全设置(值似乎无关紧要),客户端会查找~/.docker/ca.pem,如果它不存在则不会尝试连接。 docker build 不需要这样做。所以没有帮助。但好主意~
  • 我实际上认为这正是您想要的:如果您要连接到 SSL 端点,您确实需要 CA 文件,以便 Docker 可以验证连接。我在本地设置中使用 SSL 可访问的本地 Docker 实例。
  • 如果您真的想跳过 TLS 验证,您可以设置 DOCKER_TLS 而不是 DOCKER_TLS_VERIFY
  • 嗯,我真的希望 docker-compose 的行为方式与 docker 相同。
猜你喜欢
  • 2018-10-18
  • 1970-01-01
  • 2015-10-24
  • 1970-01-01
  • 2019-07-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多