Rumah > pembangunan bahagian belakang > Golang > Bagaimana untuk Menyelesaikan 'Ralat: Tidak Dapat Mengesan Fail Docker Tertentu' Semasa Membina Imej Docker daripada Kod Go?

Bagaimana untuk Menyelesaikan 'Ralat: Tidak Dapat Mengesan Fail Docker Tertentu' Semasa Membina Imej Docker daripada Kod Go?

Patricia Arquette
Lepaskan: 2024-12-18 18:18:11
asal
283 orang telah melayarinya

How to Resolve the

Bina Imej Docker daripada Kod Go: Menyelesaikan "Ralat: Tidak Dapat Mengesan Fail Docker Ditentukan"

Apabila cuba membina imej Docker menggunakan pustaka Docker API dan Docker Go, pembangun mungkin sekali-sekala menghadapi ralat yang menyatakan, "Respons ralat daripada daemon: Tidak dapat mencari Fail Docker yang ditentukan." Ralat ini biasanya berlaku apabila API Docker gagal mengenal pasti fail Docker yang disediakan dalam konteks binaan yang ditentukan.

Untuk menyelesaikan isu ini, pembangun harus mempertimbangkan langkah berikut:

  • Sahkan Kehadiran Fail dan Laluan: Pastikan Fail Docker wujud dalam konteks binaan yang ditetapkan dan laluan yang diberikan kepada Medan ImageBuildOptions.Dockerfile adalah betul. Kedua-dua laluan relatif dan mutlak harus diuji.
  • Elakkan Pautan Simbolik: Berhati-hati dengan pautan simbolik dalam laluan yang ditentukan. API Docker mungkin tidak menyelesaikannya dengan betul.
  • Letakkan Fail Docker dan Binari dalam Folder Yang Sama: Sebagai langkah penyelesaian masalah, cuba letakkan Fail Docker dalam folder yang sama dengan binari Go.
  • Pertimbangkan RemoteContext: RemoteContext membenarkan Fail Docker yang bergantung pada luaran sumber. Jika Fail Docker memerlukan kehadiran fail setempat, pendekatan ini mungkin tidak sesuai.
  • Hantar Konteks Tar sebagai Penampan: Gunakan medan ImageBuildOptions.Context untuk menghantar fail Docker sebagai penimbal tar termampat. Pastikan pengepala tar ditulis dengan betul sebelum memampatkan.

Salah satu contoh yang telah dilaporkan berfungsi dengan berkesan melibatkan mencipta bait. Penampan, menulis kandungan Dockerfile ke dalamnya dan kemudian menggunakannya sebagai ImageBuildOptions .Konteks untuk membina imej Docker. Kod yang dipotong di bawah menunjukkan pendekatan ini:

package main

import (
    "bytes"
    "context"
    "io"
    "io/ioutil"
    "log"
    "os"

    "github.com/docker/docker/api/types"
    "github.com/docker/docker/client"
)

func main() {
    ctx := context.Background()
    cli, err := client.NewEnvClient()
    if err != nil {
        log.Fatal(err, " :unable to init client")
    }

    buf := new(bytes.Buffer)
    tw := tar.NewWriter(buf)
    defer tw.Close()

    dockerFile := "myDockerfile"
    dockerFileReader, err := os.Open("/path/to/dockerfile")
    if err != nil {
        log.Fatal(err, " :unable to open Dockerfile")
    }
    readDockerFile, err := ioutil.ReadAll(dockerFileReader)
    if err != nil {
        log.Fatal(err, " :unable to read dockerfile")
    }

    tarHeader := &tar.Header{
        Name: dockerFile,
        Size: int64(len(readDockerFile)),
    }
    err = tw.WriteHeader(tarHeader)
    if err != nil {
        log.Fatal(err, " :unable to write tar header")
    }
    _, err = tw.Write(readDockerFile)
    if err != nil {
        log.Fatal(err, " :unable to write tar body")
    }
    dockerFileTarReader := bytes.NewReader(buf.Bytes())

    imageBuildResponse, err := cli.ImageBuild(
        ctx,
        dockerFileTarReader,
        types.ImageBuildOptions{
            Context:    dockerFileTarReader,
            Dockerfile: dockerFile,
            Remove:     true})
    if err != nil {
        log.Fatal(err, " :unable to build docker image")
    }
    defer imageBuildResponse.Body.Close()
    _, err = io.Copy(os.Stdout, imageBuildResponse.Body)
    if err != nil {
        log.Fatal(err, " :unable to read image build response")
    }
}
Salin selepas log masuk

Atas ialah kandungan terperinci Bagaimana untuk Menyelesaikan 'Ralat: Tidak Dapat Mengesan Fail Docker Tertentu' Semasa Membina Imej Docker daripada Kod Go?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:php.cn
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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan