首頁  >  文章  >  後端開發  >  無法在go中為docker容器寫入有效的掛載路徑

無法在go中為docker容器寫入有效的掛載路徑

王林
王林轉載
2024-02-11 14:27:181016瀏覽

無法在go中為docker容器寫入有效的掛載路徑

php小編子墨發現,有一些開發者在使用Go語言編寫docker容器時遇到了一個問題,即無法為容器寫入有效的掛載路徑。這個問題可能導致在容器中進行文件讀寫操作時出現錯誤或失敗。對開發者來說,這無疑是個令人沮喪的困擾。接下來,我們將探討這個問題的原因以及可能的解決方案,幫助開發者解決這個挑戰。

問題內容

我正在嘗試啟動一個測試容器來測試我的資料庫。我正在使用測試容器。 這是我如何設定容器的一段程式碼:

func createContainer(ctx context.Context) (testcontainers.Container, *pgxpool.Pool, string, error) {
var env = map[string]string{
        "POSTGRES_PASSWORD": DbPass,
        "POSTGRES_USER":     DbUser,
        "POSTGRES_DB":       DbName,
    }
    var port = "5432/tcp"

    // /Users/<path>:/<container path> 
    path := `/c/Users/pizhlo21/Desktop/Folder/golang/TgBotReminder/internal/db/postgresql/migration:/usr/app`

    req := testcontainers.GenericContainerRequest{
        ContainerRequest: testcontainers.ContainerRequest{
            Image:        "postgres:latest",
            ExposedPorts: []string{port},
            Env:          env,
            WaitingFor:   wait.ForLog("database system is ready to accept connections"),
            VolumeMounts: map[string]string{"/docker-entrypoint-initdb.d": path},
            SkipReaper: true,
        },
        Started: true,
    }
    container, err := testcontainers.GenericContainer(ctx, req)
    if err != nil {
        return container, nil, "", fmt.Errorf("unable to start container: %v", err)
    }
...

但我從docker 收到錯誤: failed to setup testunable to start container: failed to create container: error response from daemon: create /docker-entrypoint-initdb.d: "/docker-entrypoint-initdb. d" 包括本地捲名稱的無效字符,僅允許“[a-za-z0-9][a-za-z0-9_.-]”。如果您打算傳遞主機目錄,請使用絕對路徑

有時此錯誤如下所示:無法設定測試無法啟動容器:無法建立容器:守護程式的錯誤回應:「磁碟區」類型的安裝配置無效:安裝路徑無效:'“c” /desktop/folder/golang/tgbotreminder/internal/db/postgresql/migration/000001_init_schema.up"' 掛載路徑必須是絕對

#我嘗試了許多不同的路徑,例如:

//c/使用者/... c/用戶/... /�%/桌面/... $home/桌面/資料夾/...

但沒有任何幫助我。

如何正確執行?

解決方法

tl;dr

替換

volumemounts: map[string]string{"/docker-entrypoint-initdb.d": path},

bindmounts: map[string]string{"/docker-entrypoint-initdb.d": path},

問題 1

「/docker-entrypoint-initdb.d」包含本地磁碟區名稱的無效字符,僅允許「[a-za-z0-9][a-za-z0-9_.-]」。 p>

重要的是要知道三種類型的掛載

  • 磁碟區儲存在由 docker 管理的主機檔案系統的一部分中(linux 上為 /var/lib/docker/volumes/)。非 docker 進程不應修改檔案系統的這一部分。卷是 docker 中保存資料的最佳方式。
  • 綁定安裝可以儲存在主機系統上的任何地方。它們甚至可能是重要的系統檔案或目錄。 docker 主機或 docker 容器上的非 docker 程序可以隨時修改它們。
  • tmpfs 掛載僅儲存在主機系統的記憶體中,並且永遠不會寫入主機系統的檔案系統。

volumemounts 用於指定磁碟區掛載。從github.com/testcontainers/<a href="/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="94e0f1e7e0f7fbfae0f5fdfaf1e6e7b9f3f3d4e2a​​to5]; 的值volumemounts 中的條目儲存磁碟區名稱,該條目僅允許[a-za-z0-9][a-za-z0-9_. -],這就是您看到錯誤訊息的原因。順便說一句,要看到上面的錯誤訊息,您的程式碼必須是這樣的(請注意 /docker-entrypoint-initdb.d 是值而不是鍵):

volumemounts: map[string]string{path: "/docker-entrypoint-initdb.d"},

問題 2

類型「volume」的掛載配置無效:掛載路徑無效:「c/desktop/folder/golang/tgbotreminder/internal/db/postgresql/migration/000001_init_schema.up」掛載路徑必須是絕對的

要查看此錯誤訊息,您的程式碼必須如下所示:

volumemounts: map[string]string{`"/c/desktop/folder/golang/tgbotreminder/internal/db/postgresql/migration/000001_init_schema.up"`: "/docker-entrypoint-initdb.d"},

作為github.com/testcontainers/ <a href=" __cf_email__>),因此它是無效的。docker 守護程式首先驗證掛載路徑。這就是您看到錯誤訊息的原因。</a>

考慮升級 github.com/testcontainers/testcontainers-go

#在版本v0.13.0中,containerrequest.bindmountscontainerrequest.volumemounts 替換為 containerrequest.mounts。這是因為「基於映射的資料結構在某種程度上令人困惑。此變更透過為所有元件引入專用類型以獲得 ide 和編譯器的幫助來避免混亂」。 (請參閱 pr#386)。

升级到 github.com/testcontainers/<a href="/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="9aeeffe9eef9f5f4eefbf3f4ffe8e9b7fdf5daecaab4a8abb4aa">[电子邮件受保护]</a> 后,可以使用以下方式指定绑定安装:

Mounts: testcontainers.Mounts(
    testcontainers.BindMount(path, "/docker-entrypoint-initdb.d"),
),

以上是無法在go中為docker容器寫入有效的掛載路徑的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:stackoverflow.com。如有侵權,請聯絡admin@php.cn刪除