>  기사  >  백엔드 개발  >  도커 이미지를 로드하지 못했습니다.

도커 이미지를 로드하지 못했습니다.

WBOY
WBOY앞으로
2024-02-13 08:20:091066검색

도커 이미지를 로드하지 못했습니다.

php 편집기 Strawberry는 Docker를 사용할 때 "Docker 이미지를 로드하지 못했습니다"라는 일반적인 문제에 직면할 수 있습니다. 이 문제로 인해 Docker를 사용하여 컨테이너를 정상적으로 구축하고 실행하지 못할 수 있습니다. 하지만 걱정하지 마세요. 일반적으로 이 문제에 대한 해결책은 여러 가지가 있습니다. 이 문서에서는 Docker 이미지를 성공적으로 로드하고 이 성가신 문제를 해결하는 데 도움이 되는 몇 가지 일반적인 솔루션을 소개합니다. Docker 초보자이시든 숙련된 Docker 사용자이시든, 이 글이 도움이 되기를 바랍니다.

질문 내용

저는 golangdocker 客户端 加载 .tar 형식의 도커 이미지를 사용하고 있습니다.

으아아아

// 함수: getimageidbyrepotag

으아아아

getimageidbyrepotag 始终返回 fmt.errorf("未找到存储库标记的图像 id: %s", repotag). 또한 docker images 실행하면 이미지가 로드되는 것을 볼 수 없습니다. 아직 이미지 로딩이 끝나지 않은 것 같습니다.

내 다른 코드에서는 docker 클라이언트 cli.imageload 立即返回,但 docker 映像加载通常需要一些时间。我通常会在检查 getimageidbyrepotag가 이전에 약 30초의 대기 시간을 추가했습니다. 이 경우에는 대기 시간을 추가하는 것도 도움이 되지 않습니다.

감사합니다

해결책

몇 가지 질문:

  • 이 두 고루틴은 공유되므로 err 일부 오류 처리가 손실될 수 있습니다.
    • 여기서는 각 고루틴에 대해 고유한 오류 변수를 사용해야 하며 wg.wait()
    • 후에 두 오류를 모두 확인해야 합니다.
  • 주요 문제: tar 阅读器中读取内容以查找清单文件并提取标签信息 - 这很好 - 但找到后,您将字节流的其余部分复制到管道中。因此,您将丢失一块永远不会到达 docker클라이언트
  • 에서 바이트 스트림을 받고 있습니다.

tar 바이트 스트림을 두 번 읽는 것을 방지하려면 io.teereader를 사용할 수 있습니다. 이를 통해 tar 아카이브를 읽을 수 있습니다 - 클라이언트 스캔 manifest 文件 - 但也可以将此流完整写入其他地方(即写入 docker).

만들기 teereader:

으아아아

이미지 로딩은 이제 여기(파이프 대신)에서 읽혀집니다:

으아아아

그런 다음 archive/tar리더를 파이프에서 읽도록 변경하세요.

으아아아

그런 다음 io.copy 블록을 삭제할 수 있습니다:

으아아아

tar 검사 코드는 전체 스트림을 eof로 읽어오기 때문입니다.

P.S. io.eof 重置为 nil 以避免在检查来自任一 goroutine 的任何潜在错误时认为 eof를 더 심각한 오류로 변환해야 할 수도 있습니다.

으아아아

위 내용은 도커 이미지를 로드하지 못했습니다.의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 stackoverflow.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제