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/桌面/資料夾/...
但沒有任何幫助我。
如何正確執行?
替換
volumemounts: map[string]string{"/docker-entrypoint-initdb.d": path},
與
bindmounts: map[string]string{"/docker-entrypoint-initdb.d": path},
「/docker-entrypoint-initdb.d」包含本地磁碟區名稱的無效字符,僅允許「[a-za-z0-9][a-za-z0-9_.-]」。 p>
重要的是要知道三種類型的掛載:
/var/lib/docker/volumes/
)。非 docker 進程不應修改檔案系統的這一部分。卷是 docker 中保存資料的最佳方式。 tmpfs
掛載僅儲存在主機系統的記憶體中,並且永遠不會寫入主機系統的檔案系統。 volumemounts
用於指定磁碟區掛載。從github.com/testcontainers/<a href="/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="94e0f1e7e0f7fbfae0f5fdfaf1e6e7b9f3f3d4e2ato5];
的值volumemounts
中的條目儲存磁碟區名稱,該條目僅允許[a-za-z0-9][a-za-z0-9_. -]
,這就是您看到錯誤訊息的原因。順便說一句,要看到上面的錯誤訊息,您的程式碼必須是這樣的(請注意 /docker-entrypoint-initdb.d
是值而不是鍵):
volumemounts: map[string]string{path: "/docker-entrypoint-initdb.d"},
類型「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="/cdn-cgi/l/email-protection" class="__cf_email__" __cf_email__" data-cfemail="4443021373027272b2a302a3025443021373027272b2a302a3025a302a3025 1132b2b2a2b2a2b2a2b2b2b2binging a>
, volumemounts
中條目的鍵儲存掛載路徑。由於掛載路徑包含雙引號("
),因此它是無效的。docker 守護程式首先驗證掛載路徑。這就是您看到錯誤訊息的原因。
github.com/testcontainers/testcontainers-go
#在版本v0.13.0中,containerrequest.bindmounts
和 containerrequest.volumemounts
替換為 containerrequest.mounts
。這是因為「基於映射的資料結構在某種程度上令人困惑。此變更透過為所有元件引入專用類型以獲得 ide 和編譯器的幫助來避免混亂」。 (請參閱 pr#386)。
升级到 github.com/testcontainers/[电子邮件受保护]
后,可以使用以下方式指定绑定安装:
Mounts: testcontainers.Mounts( testcontainers.BindMount(path, "/docker-entrypoint-initdb.d"), ),
以上是無法在go中為docker容器寫入有效的掛載路徑的詳細內容。更多資訊請關注PHP中文網其他相關文章!