Jadual Kandungan
Kandungan soalan
Penyelesaian
Rumah pembangunan bahagian belakang Golang Gagal memuatkan imej buruh pelabuhan

Gagal memuatkan imej buruh pelabuhan

Feb 13, 2024 am 08:20 AM

Gagal memuatkan imej buruh pelabuhan

editor php Strawberry mungkin menghadapi masalah biasa apabila menggunakan Docker, iaitu "gagal memuatkan imej Docker". Masalah ini mungkin menghalang kami daripada menggunakan Docker untuk membina dan menjalankan bekas seperti biasa. Tetapi jangan risau, biasanya terdapat pelbagai penyelesaian untuk masalah ini. Artikel ini akan memperkenalkan anda kepada beberapa penyelesaian biasa untuk membantu anda berjaya memuatkan imej Docker dan menyelesaikan masalah yang menjengkelkan ini. Sama ada anda seorang pemula atau pengguna Docker yang berpengalaman, saya harap artikel ini akan membantu anda.

Kandungan soalan

Saya menggunakan golangdocker 客户端 加载 .tar format imej docker.

func loadimagefromtar(cli *client.client, tarfilepath string) (string, error) {
    // read tar file
    tarfile, err := os.open(tarfilepath)
    if err != nil {
        return "", fmt.errorf("failed to open tar file: %w", err)
    }
    defer tarfile.close()

    // create a pipe to stream data between tar reader and docker client
    pr, pw := io.pipe()

    // set up a waitgroup for synchronization
    var wg sync.waitgroup
    wg.add(2)

    // load the docker image in a separate goroutine
    var imageloadresponse types.imageloadresponse
    go func() {
        defer wg.done()
        imageloadresponse, err = cli.imageload(context.background(), pr, false)
        if err != nil {
            err = fmt.errorf("failed to load docker image: %w", err)
        }
    }()

    // read tar file metadata and copy the tar file to the pipe writer in a separate goroutine
    var repotag string
    go func() {
        defer wg.done()
        defer pw.close()

        tarreader := tar.newreader(tarfile)

        for {
            header, err := tarreader.next()
            if err == io.eof {
                break
            }
            if err != nil {
                err = fmt.errorf("failed to read tar header: %w", err)
                fmt.printf("error: %v", err)
                return
            }

            // extract the repository and tag from the manifest file
            if header.name == "manifest.json" {
                data, err := io.readall(tarreader)
                if err != nil {
                    err = fmt.errorf("failed to read manifest file: %w", err)
                    fmt.printf("error: %v", err)
                    return
                }

                var manifest []map[string]interface{}
                err = json.unmarshal(data, &manifest)
                if err != nil {
                    err = fmt.errorf("failed to unmarshal manifest: %w", err)
                    fmt.printf("error: %v", err)
                    return
                }

                repotag = manifest[0]["repotags"].([]interface{})[0].(string)
            }

            // copy the tar file data to the pipe writer
            _, err = io.copy(pw, tarreader)
            if err != nil {
                err = fmt.errorf("failed to copy tar data: %w", err)
                fmt.printf("error: %v", err)
                return
            }
        }
    }()

    // wait for both goroutines to finish
    wg.wait()

    // check if any error occurred in the goroutines
    if err != nil {
        return "", err
    }

    // close the image load response body
    defer imageloadresponse.body.close()

    // get the image id
    imageid, err := getimageidbyrepotag(cli, repotag)
    if err != nil {
        return "", fmt.errorf("failed to get image id: %w", err)
    }

    return imageid, nil
}

// Fungsi: getimageidbyrepotag

func getImageIDByRepoTag(cli *client.Client, repoTag string) (string, error) {
    images, err := cli.ImageList(context.Background(), types.ImageListOptions{})
    if err != nil {
        return "", fmt.Errorf("failed to list images: %w", err)
    }

    for _, image := range images {
        for _, tag := range image.RepoTags {
            if tag == repoTag {
                return image.ID, nil
            }
        }
    }

    return "", fmt.Errorf("image ID not found for repo tag: %s", repoTag)
}

getimageidbyrepotag 始终返回 fmt.errorf("未找到存储库标记的图像 id: %s", repotag). Selain itu, apabila saya berlari docker images saya tidak nampak imej sedang dimuatkan. Nampaknya pemuatan imej belum selesai lagi.

Dalam kod saya yang lain walaupun klien docker cli.imageload 立即返回,但 docker 映像加载通常需要一些时间。我通常会在检查 getimageidbyrepotag menambah kira-kira 30 saat masa menunggu sebelum ini. Menambah masa menunggu juga tidak membantu dalam kes ini.

Terima kasih

Penyelesaian

Beberapa soalan:

  • Dua goroutine ini dikongsi err jadi beberapa pengendalian ralat mungkin hilang
    • Anda harus menggunakan pembolehubah ralat unik untuk setiap goroutine di sini dan semak kedua-dua ralat selepas wg.wait()
  • Masalah utama: Anda mendapat aliran bait daripada tar 阅读器中读取内容以查找清单文件并提取标签信息 - 这很好 - 但找到后,您将字节流的其余部分复制到管道中。因此,您将丢失一块永远不会到达 docker pelanggan

Untuk mengelakkan membaca strim tar byte dua kali, anda boleh menggunakan io.teereader. Ini membolehkan anda membaca arkib tar - imbas manifest 文件 - 但也可以将此流完整写入其他地方(即写入 docker klien).

Buat teereader:

tr := io.teereader(tarfile, pw)  // reading `tr` will read the tarfile - but simultaneously write to `pw`

Pemuatan imej kini akan dibaca dari sini (bukan paip):

//imageloadresponse, err = cli.imageload(context.background(), pr, false)
imageloadresponse, err = cli.imageload(context.background(), tr, false)

Kemudian tukar archive/tar pembaca anda untuk membaca dari paip:

//tarreader := tar.newreader(tarfile) // direct from file
tarreader := tar.newreader(pr) // read from pipe (indirectly from the file)

Anda kemudian boleh memadamkan blok io.copy:

// no longer needed:
//
// _, err = io.copy(pw, tarreader)
//

Kerana kod pemeriksaan tar akan membaca keseluruhan aliran ke dalam eof.

P.S. Anda mungkin perlu menukar io.eof 重置为 nil 以避免在检查来自任一 goroutine 的任何潜在错误时认为 eof kepada ralat yang lebih serius:

header, err = tarReader.Next()
if err == io.EOF {
    err = nil  //  EOF is a non-fatal error here
    break
}

Atas ialah kandungan terperinci Gagal memuatkan imej buruh pelabuhan. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn

Alat AI Hot

Undress AI Tool

Undress AI Tool

Gambar buka pakaian secara percuma

Undresser.AI Undress

Undresser.AI Undress

Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover

AI Clothes Remover

Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Clothoff.io

Clothoff.io

Penyingkiran pakaian AI

Video Face Swap

Video Face Swap

Tukar muka dalam mana-mana video dengan mudah menggunakan alat tukar muka AI percuma kami!

Artikel Panas

Mejiro Ryan Build Guide | Uma Musume Pretty Derby
1 bulan yang lalu By Jack chen
Rimworld Odyssey Cara Ikan
4 minggu yang lalu By Jack chen
Apakah had transaksi untuk pengguna asing di Alipay?
1 bulan yang lalu By 下次还敢

Alat panas

Notepad++7.3.1

Notepad++7.3.1

Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina

SublimeText3 versi Cina

Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1

Hantar Studio 13.0.1

Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6

Dreamweaver CS6

Alat pembangunan web visual

SublimeText3 versi Mac

SublimeText3 versi Mac

Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Topik panas

Tutorial PHP
1505
276
Cara membina pelayan web di mana sahaja Cara membina pelayan web di mana sahaja Jul 15, 2025 am 03:05 AM

Ia tidak sukar untuk membina pelayan web yang ditulis dalam Go. Inti terletak pada menggunakan pakej NET/HTTP untuk melaksanakan perkhidmatan asas. 1. Gunakan NET/HTTP untuk memulakan pelayan yang paling mudah: fungsi pemprosesan mendaftar dan mendengar port melalui beberapa baris kod; 2. 3. Amalan Umum: Routing Kumpulan oleh Modul Fungsional, dan gunakan perpustakaan pihak ketiga untuk menyokong padanan kompleks; 4. Perkhidmatan Fail Statik: Sediakan fail HTML, CSS dan JS melalui http.fileserver; 5. Prestasi dan Keselamatan: Aktifkan HTTPS, hadkan saiz badan permintaan, dan tetapkan masa tamat untuk meningkatkan keselamatan dan prestasi. Selepas menguasai perkara -perkara utama ini, lebih mudah untuk mengembangkan fungsi.

Pergi untuk pemprosesan audio/video Pergi untuk pemprosesan audio/video Jul 20, 2025 am 04:14 AM

Inti pemprosesan audio dan video terletak pada pemahaman proses asas dan kaedah pengoptimuman. 1. Proses asas termasuk pengambilalihan, pengekodan, penghantaran, penyahkodan dan main balik, dan setiap pautan mempunyai kesukaran teknikal; 2. Masalah biasa seperti penyimpangan audio dan video, kelewatan lag, bunyi bunyi, gambar kabur, dan lain -lain boleh diselesaikan melalui pelarasan segerak, pengoptimuman pengekodan, modul pengurangan hingar, pelarasan parameter, dan sebagainya; 3. Adalah disyorkan untuk menggunakan FFMPEG, OpenCV, WebRTC, GSTREAMER dan alat lain untuk mencapai fungsi; 4. Dari segi pengurusan prestasi, kita harus memberi perhatian kepada pecutan perkakasan, penetapan kadar bingkai resolusi yang munasabah, masalah konvensyen dan masalah kebocoran memori. Menguasai perkara utama ini akan membantu meningkatkan kecekapan pembangunan dan pengalaman pengguna.

Pergi pilih dengan kes lalai Pergi pilih dengan kes lalai Jul 14, 2025 am 02:54 AM

Tujuan Select Plus Default adalah untuk membolehkan Pilih untuk melakukan tingkah laku lalai apabila tiada cawangan lain yang bersedia untuk mengelakkan penyekatan program. 1. Apabila menerima data dari saluran tanpa menyekat, jika saluran kosong, ia akan terus memasuki cawangan lalai; 2. Dalam kombinasi dengan masa. Selepas atau ticker, cuba hantar data dengan kerap. Jika saluran penuh, ia tidak akan menyekat dan melangkau; 3. Mencegah kebuntuan, elakkan program terperangkap apabila tidak pasti sama ada saluran ditutup; Apabila menggunakannya, sila ambil perhatian bahawa cawangan lalai akan dilaksanakan dengan serta -merta dan tidak boleh disalahgunakan, dan lalai dan kes saling eksklusif dan tidak akan dilaksanakan pada masa yang sama.

Membangunkan pengendali Kubernet di mana sahaja Membangunkan pengendali Kubernet di mana sahaja Jul 25, 2025 am 02:38 AM

Cara yang paling berkesan untuk menulis Kubernetesoperator adalah untuk menggunakan Go untuk menggabungkan Kubebuilder dan pengawal-runtime. 1. Memahami corak pengendali: Tentukan sumber tersuai melalui CRD, tulis pengawal untuk mendengar perubahan sumber dan lakukan gelung perdamaian untuk mengekalkan keadaan yang diharapkan. 2. Gunakan Kubebuilder untuk memulakan projek dan membuat API untuk menghasilkan CRD, pengawal dan konfigurasi secara automatik. 3. Tentukan spec dan struktur status CRD dalam API/V1/MYAPP_TYPES.GO, dan menjalankan makeManifests untuk menjana cRDYAML. 4. Daftar masuk dalam pengawal

Contoh API GO REST Contoh API GO REST Jul 14, 2025 am 03:01 AM

Bagaimana dengan cepat melaksanakan contoh Restapi yang ditulis dalam GO? Jawapannya adalah menggunakan perpustakaan standard Net/HTTP, yang boleh diselesaikan mengikut tiga langkah berikut: 1. Sediakan struktur projek dan memulakan modul; 2. Tentukan struktur data dan fungsi pemprosesan, termasuk mendapatkan semua data, mendapatkan data tunggal berdasarkan ID, dan membuat data baru; 3. Daftar laluan dalam fungsi utama dan mulakan pelayan. Seluruh proses tidak memerlukan perpustakaan pihak ketiga. Fungsi Restapi Asas dapat direalisasikan melalui perpustakaan standard dan boleh diuji melalui penyemak imbas atau pos.

Pergi antara muka {} vs ada Pergi antara muka {} vs ada Jul 11, 2025 am 02:38 AM

Dalam bahasa Go, antara muka {} dan mana -mana jenis yang sama. Sejak GO1.18, mana -mana telah diperkenalkan sebagai alias untuk antara muka {}. Tujuan utama adalah untuk meningkatkan kebolehbacaan dan kejelasan semantik kod; 1. 2. Interface {} lebih sesuai untuk menentukan tingkah laku antara muka, menekankan jenis antara muka, atau serasi dengan kod lama; 3. Prestasi kedua adalah sama dengan mekanisme asas, dan pengkompil akan menggantikan apa -apa dengan antara muka {}, yang tidak akan menyebabkan overhead tambahan; 4. Perhatikan untuk menaip isu keselamatan semasa menggunakannya, dan mungkin perlu bekerjasama dengan penegasan jenis atau

Cara Mendapatkan Perlindungan Kod untuk Ujian Golang Cara Mendapatkan Perlindungan Kod untuk Ujian Golang Jul 12, 2025 am 02:58 AM

Gunakan perintah terbina dalam getest untuk menjana data liputan: Run Getest-Cover./... untuk memaparkan peratusan liputan setiap pakej, atau gunakan getest-coverprofile = liputan.out. Mengintegrasikan Laporan Liputan di CI: Buat fail liputan.out, dan muat naik analisis melalui alat pihak ketiga seperti codecov atau coveralls, sebagai contoh, menggunakan curl-data-binary@coverage.o

Cara Menyiapkan Golangci-Lint untuk Projek Cara Menyiapkan Golangci-Lint untuk Projek Jul 12, 2025 am 03:06 AM

Langkah-langkah pemasangan Golangci-lint adalah: 1. Pasang menggunakan pemasangan binari atau perintah goinstall; 2. Sahkan sama ada pemasangan berjaya; Kaedah konfigurasi termasuk: 3. Buat fail .golangci.yml untuk membolehkan/melumpuhkan linter, menetapkan laluan pengecualian, dan sebagainya; Kaedah integrasi adalah: 4. Tambah langkah -langkah lint dalam CI/CD (seperti githubactions) untuk memastikan bahawa pemeriksaan LINT secara automatik dijalankan untuk setiap penyerahan dan PR.

See all articles