キャッシュの復元が "Permission Denied" で失敗する

Workflow を使用し、キャッシュの保存と復元 Workspace の恒久化を行なう場合、ユーザーとディレクトリが関係することに留意してください。 CircleCI のビルド済み Docker イメージを使用する場合、各 Docker コンテナは同じユーザーで、同じベースアクセス許可を使用して実行されます。 1 つのイメージを使用するジョブにキャッシュを保存し、別のジョブに復元する場合、アクセス許可が互換であることを確認してください。

キャッシュの復元時に "Permission denied" というエラーが表示される場合、以前のジョブで保存した場所を確認します。 よくあるのは、イメージをrootユーザーとして使用し、キャッシュを保存してから、rootアクセス許可のないユーザーが、以後のジョブにそのキャッシュの復元を試みたときです。

また、アクセス許可が正しく設定されていなければ、同じエラーによって Workspace のファイルも恒久化されない場合があります。

Untitled.png

 

この `キャッシュ復元` のステップでは、元のイメージはrootとして実行されており、作業ディレクトリが `~/tmp` に設定されていたため、キャッシュが元は `/root/tmp` に保存されたことが分かります。 Workflow のこの部分は、CircleCI ユーザー下で実行され、`/root` フォルダーにアクセスできません。

可能なら、複数のジョブ間で同じイメージを使用してください。 それが難しい場合は、2 つのイメージ間で共通の場所に作業ディレクトリを設定してください (`/tmp` が使用できることがあります)。 また、キャッシュを保存する前に、ファイルのアクセス許可を変更または設定する必要があります。

例:`chmod -R 777 ./workingDirectory` を使用して、これらのファイルに対する完全な読み取り/書き込みアクセス権を付与します。

ベストな方法は、ジョブ間で共通のイメージを使用することです。 CircleCI で提供しているビルド済み Docker イメージに、プロジェクトに必要な要素が欠けている場合、CircleCI 製イメージの 1 つをカスタマイズすることを検討してください。

OSアーキテクチャによるアクセス権限問題

ある環境で生成されたキャッシュは異なるアーキテクチャの環境で復元された場合、アクセスできなくなる問題があります。 キャッシュキーに {arch} を追加することで、この問題を回避することができます。 アーキテクチャによって違うキャッシュを使用するようにします。

- restore_cache: 
key: '-v1-node-cache-{{ checksum "yarn.lock" }}-{{ arch}}'
- run: name: Install App command: yarn
- save_cache:
key: '-v1-node-cache-{{ checksum "yarn.lock" }}-{{ arch }}'
paths:
- node_modules
この記事は役に立ちましたか?
23人中5人がこの記事が役に立ったと言っています

コメント

0件のコメント

サインインしてコメントを残してください。