ホームページ  >  記事  >  バックエンド開発  >  Go で Docker コンテナの有効なマウント パスを書き込めません

Go で Docker コンテナの有効なマウント パスを書き込めません

王林
王林転載
2024-02-11 14:27:181016ブラウズ

Go で Docker コンテナの有効なマウント パスを書き込めません

php エディター Zimo は、一部の開発者が Go 言語を使用して Docker コンテナーを作成するときに問題に遭遇したこと、つまり、コンテナーの有効なマウント パスを作成できないことを発見しました。この問題により、コンテナーでのファイルの読み取りおよび書き込み操作中にエラーまたは障害が発生する可能性があります。開発者にとって、これは間違いなくイライラする問題です。次に、この問題の原因と、開発者がこの課題を解決できるように考えられる解決策を検討します。

質問内容

データベースをテストするためにテストコンテナを起動しようとしています。テストコンテナを使用しています。 コンテナの設定方法のスニペットを次に示します:

リーリー

しかし、docker からエラーが発生しました: testunable のセットアップに失敗しましたコンテナを開始できませんでした: コンテナを作成できませんでした: デーモンからのエラー応答: 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/user/... c/ユーザー/... /�%/デスクトップ/... $ホーム/デスクトップ/フォルダー/...

しかし、何も役に立ちませんでした。

それを正しく実行するにはどうすればよいですか?

解決策

tl;dr

###交換する### リーリー ###そして### リーリー ###質問1###

「/docker-entrypoint-initdb.d」にはローカル ボリューム名として無効な文字が含まれています。許可されるのは「[a-za-z0-9][a-za-z0-9_.-]」のみです。

知っておくことが重要です

マウントには 3 つのタイプがあります

:

p>

ボリューム は、docker によって管理されるホスト ファイル システムの一部 (Linux では /var/lib/docker/volumes/

) に保存されます。非 Docker プロセスは、ファイル システムのこの部分を変更しないでください。ボリュームは、Docker にデータを保存する最良の方法です。
  • バインド マウント は、ホスト システム上の どこでも に保存できます。重要なシステム ファイルやディレクトリである場合もあります。これらは、Docker ホストまたは Docker コンテナー上の非 Docker プロセスによっていつでも変更できます。
  • tmpfs マウント はホスト システムのメモリにのみ保存され、ホスト システムのファイル システムに書き込まれることはありません。
  • volumemounts ボリューム マウントを指定するために使用されます。 github.com/testcontainers/[email protected] から。
  • volumemounts
のエントリの

値には、 ボリューム名 が格納されます。これには、[a-za-z0-9][a-za-z0-9_] のみが許可されます。 . -] なので、エラー メッセージが表示されます。ところで、上記のエラー メッセージを表示するには、コードは次のようになっている必要があります (/docker-entrypoint-initdb.d はキーではなく値であることに注意してください)。 リーリー ###質問2### タイプ「ボリューム」のマウント構成が無効です: 無効なマウント パス: 「c/desktop/folder/golang/tgbotreminder/internal/db/postgresql/migration/000001_init_schema.up」マウント パスは絶対である必要があります このエラー メッセージを表示するには、コードは次のようになっている必要があります: リーリー asgithub.com/testcontainers/ ) が含まれているため、無効です。docker デーモンは最初にマウント パスを検証します。そのため、エラー メッセージが表示されます。

アップグレードを検討してください

github.com/testcontainers/testcontainers-go バージョン v0.13.0 では、containerrequest.bindmounts

および

containerrequest.volumemountscontainerrequest.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 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はstackoverflow.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。