Rumah >pembangunan bahagian belakang >Golang >Bagaimana untuk Membetulkan Ralat 'Tidak Dapat Mengesan Fail Docker Tertentu' Semasa Membina Imej Docker dari Go?

Bagaimana untuk Membetulkan Ralat 'Tidak Dapat Mengesan Fail Docker Tertentu' Semasa Membina Imej Docker dari Go?

Mary-Kate Olsen
Mary-Kate Olsenasal
2024-12-15 19:21:10239semak imbas

How to Fix

Membina Imej Docker daripada Kod Go: Menyelesaikan Ralat Lokasi Fail Docker

Apabila cuba membina imej Docker menggunakan pustaka Docker API dan Docker Go, adalah perkara biasa untuk menghadapi ralat yang berkaitan dengan lokasi Dockerfile yang ditentukan. Mesej ralat "Respons ralat daripada daemon: Tidak dapat mencari Fail Docker yang ditentukan" menunjukkan bahawa laluan yang disediakan ke Fail Docker tidak betul atau Fail Docker tidak ditemui.

Penyelesaian:

Untuk menyelesaikan isu ini, sahkan perkara berikut:

  1. Pastikan folder yang mengandungi Fail Docker wujud dalam laluan binaan.
  2. Semak laluan ke Fail Docker. Gunakan laluan relatif atau mutlak yang menghala terus ke Dockerfile.
  3. Hapuskan penggunaan pautan lembut dalam laluan ke Dockerfile.
  4. Uji sama ada Dockerfile boleh dibina menggunakan binaan docker standard arahan.

Jika semua langkah di atas telah diambil dan ralat berterusan, cuba yang berikut pendekatan:

  1. Gunakan penimbal tar untuk menyediakan kandungan Dockerfile kepada fungsi ImageBuild.
  2. Buat arkib tar bagi Dockerfile.
  3. Lepasi arkib tar sebagai an io.Reader kepada medan Konteks struct ImageBuildOptions.
  4. Nyatakan nama Fail Docker sebagai medan Fail Docker dalam struct ImageBuildOptions.

Kod Contoh:

package main

import (
    "archive/tar"
    "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")
    }
}

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

Kenyataan:
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