>  기사  >  백엔드 개발  >  Go에서 Docker 컨테이너에 대한 유효한 마운트 경로를 쓸 수 없습니다.

Go에서 Docker 컨테이너에 대한 유효한 마운트 경로를 쓸 수 없습니다.

王林
王林앞으로
2024-02-11 14:27:181016검색

Go에서 Docker 컨테이너에 대한 유효한 마운트 경로를 쓸 수 없습니다.

PHP 편집자 Zimo는 일부 개발자가 Go 언어를 사용하여 Docker 컨테이너를 작성할 때 문제에 직면했다는 사실을 발견했습니다. 즉, 컨테이너에 대한 유효한 탑재 경로를 작성할 수 없습니다. 이 문제로 인해 컨테이너에서 파일 읽기 및 쓰기 작업 중에 오류나 실패가 발생할 수 있습니다. 개발자에게 이는 의심할 여지 없이 실망스러운 문제입니다. 다음으로, 이 문제의 원인과 개발자가 이 문제를 해결하는 데 도움이 되는 가능한 솔루션을 살펴보겠습니다.

질문 내용

데이터베이스를 테스트하기 위해 테스트 컨테이너를 시작하려고 합니다. 테스트 용기를 사용하고 있습니다. 다음은 컨테이너 설정 방법에 대한 스니펫입니다.

으아악

하지만 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/用户/... /%cd%/桌面/... $home/桌面/文件夹/...

그러나 아무것도 나에게 도움이 되지 않았습니다.

올바르게 수행하는 방법은 무엇입니까?

솔루션

tl;dr

교체

으아악

그리고

으아악

질문 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="94e0f1e7e0f7fbfae0f5fdfaf1e6e7b9f3fbd4e2a4baa5a6baa4">[이메일 보호]</a> volumemounts의 항목 값은 [a-za-z0-9][a-za-z0-9_.-만 허용하는 <code>volumemounts 用于指定卷挂载。从 github.com/testcontainers/<a href="/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="94e0f1e7e0f7fbfae0f5fdfaf1e6e7b9f3fbd4e2a4baa5a6baa4">[email protected]</a> 的值volumemounts 中的条目存储卷名称,该条目仅允许 [a-za-z0-9][a-za-z0-9_.-],这就是您看到错误消息的原因。顺便说一句,要看到上面的错误消息,您的代码必须是这样的(请注意 /docker-entrypoint-initdb.d볼륨 이름

을 저장합니다. ] , 이것이 바로 오류 메시지가 표시되는 이유입니다. 그런데, 위의 오류 메시지를 보려면 코드가 다음과 같아야 합니다(/docker-entrypoint-initdb.d는 키가 아니라 값이라는 점에 유의하세요).

으아악

질문 2

"볼륨" 유형에 대한 잘못된 마운트 구성: 잘못된 마운트 경로: "c/desktop/folder/golang/tgbotreminder/internal/db/postgresql/migration/000001_init_schema.up" 마운트 경로는 절대 경로여야 합니다

이 오류 메시지를 보려면 코드가 다음과 같아야 합니다.

으아악 github.com/testcontainers/ <a href="/cdn-cgi/l/email-protection" class="__cf_email__" __cf_email__ data-cfemail="4443021373027272b2a302a30252a2a2a2a2113632132b21132b21132b21132b2b2a2b2a2b2a2b2b2b2binging a> volumemounts 中条目的键存储挂载路径。由于挂载路径包含双引号("> as </a>

)이므로 유효하지 않습니다. docker 데몬은 먼저 마운트 경로를 확인합니다. 이것이 바로 오류 메시지가 나타나는 이유입니다.

github.com/testcontainers/testcontainers-go업그레이드를 고려해보세요

버전 v0.13.0containerrequest.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으로 문의하시기 바랍니다. 삭제