bbizinets.life
n8nのDockerでファイル書き込みできない原因と解決手順【The file is not writable】
実践ログ

n8nのDockerでファイル書き込みできない原因と解決手順【The file is not writable】

n8nのRead/Write Files from Diskノードを使ったとき、The file is not writableというエラーが出て困っていませんか。

chmod 777を試しても、chownでオーナーを変えても、何度やっても解消しない。そういうケースの場合、原因はOSの権限ではありません。

このエラーは、n8nのDocker環境が持つ内部のファイルアクセス制限が原因です。私も同じところで長時間詰まりました。この記事では、実際に詰まった状況と、そこから解決した手順をそのまま書きます。

結論:このエラーはOS権限ではなくn8n内部の制限が原因です

最初に断言します。chmodchownでは解決しません。

n8nはDocker環境で動作する際、書き込みを許可するディレクトリを環境変数で明示しなければならない仕様になっています。この制限を設定せずにファイルを書こうとすると、OS側の権限に関係なくnot writableエラーが返ってきます。

ボリュームマウントの追加と環境変数`N8N_RESTRICT_FILE_ACCESS_TO`の設定、この2点で即座に解決しました。

症状の確認:「The file is not writable」が消えない

あなたの状況はこうではないですか。

  • n8nのRead/Write Files from DiskノードでWrite File to Diskを実行した
  • The file "/some/path/file.json" is not writable.が返ってくる
  • Dockerコンテナ内でターミナルから直接ファイルを作成すると成功する
  • chmod 777でフォルダの権限を最大にしても変わらない
  • chown -R 1000:1000でオーナーを変えても変わらない

私が詰まったのもまったく同じ状況でした。ターミナルからdocker execでコンテナ内に入り、touch /home/node/.n8n/sessions/test.txtを実行するとファイルは作れます。でもn8nのノードからは書けない。

この「OSは通るがn8nは通らない」という状況が、原因がOS権限ではないことの証拠です。

原因:n8nのDockerコンテナにはファイルアクセス制限がある

なぜchmodが無駄なのか、構造的に見てみましょう。

n8nはバージョン2系以降、セキュリティ上の理由からファイルシステムへのアクセスをサンドボックス的に制限しています。

あなたの操作
↓
n8nノード(Read/Write Files from Disk)
↓
n8n内部のアクセス制限チェック ← ここで止まる(OSまで届かない)
↓
OSの権限チェック(ここまで到達していない)

OSの権限を変えても意味がありません。n8nが「このパスへの書き込みは許可されていない」と判断した時点で処理が止まります。

n8nが許可するパスは、環境変数N8N_RESTRICT_FILE_ACCESS_TOで指定します。この変数が設定されていない、または設定しているパスと実際の書き込み先が一致していない場合にエラーになります。

さらにDockerを使っている場合は、コンテナ内のパスとホスト側のパスのマッピングも正しく設定する必要があります。

ここまでで「なぜエラーが出るか」の構造は見えてきたと思います。
ただし、このままだとどのパスをどう設計すればいいかは判断できません
これは設計の問題です。→ 判断軸の整理はこちら

解決手順:ボリュームマウントと環境変数の設定

実際に私が行った手順を順番に書きます。

手順1:専用のディレクトリをホスト側に作成する

mkdir -p /root/n8n/files/sessions
chown -R 1000:1000 /root/n8n/files

1000はn8nコンテナ内のnodeユーザーのUIDです。このオーナー変更は必要です。

手順2:docker-compose.ymlにボリュームマウントを追加する

volumesセクションに以下を追加します。

volumes:
  - n8n_data:/home/node/.n8n
  - /root/n8n/files:/files  # ← これを追加

ホスト側の/root/n8n/filesをコンテナ内の/filesとしてマウントします。

手順3(最重要):環境変数を追加する

environmentセクションに以下を追加します。この設定がなければ他の手順を全部やっても解決しません。

environment:
  - N8N_RESTRICT_FILE_ACCESS_TO=/files
  - N8N_FILESYSTEM_ALLOW_WRITE=/files

手順4:コンテナを再起動する

docker compose -f /root/n8n/docker-compose.yml up -d

手順5:n8nノードのFile Pathを更新する

Read/Write Files from DiskノードのFile Path and Nameを以下のように変更します。

/files/sessions/session_{{ $json.ts }}.json

この設定でExecute stepを実行すると、正常に書き込みができるようになります。

実際に動いた構成(docker-compose.yml)

参考までに、私の環境で動作確認済みのdocker-compose.ymlを掲載します。ご自身の環境に合わせて必要な部分だけ使ってください。

services:
  n8n:
    image: n8nio/n8n
    restart: always
    ports:
      - "5678:5678"
    environment:
      - N8N_HOST=your-domain.com
      - N8N_PORT=5678
      - N8N_PROTOCOL=https
      - WEBHOOK_URL=https://your-domain.com/
      - N8N_SECURE_COOKIE=true
      - N8N_RESTRICT_FILE_ACCESS_TO=/files        # 追加
      - N8N_FILESYSTEM_ALLOW_WRITE=/files          # 追加
    volumes:
      - n8n_data:/home/node/.n8n
      - /root/n8n/files:/files                     # 追加
volumes:
  n8n_data:

version: '3.8'は削除しています。最新のDocker Composeではobsoleteの警告が出るためです。

環境:n8n 2.17.7・Docker・Ubuntu 24・Hetzner VPS

ハマりやすいポイント3つ

同じところで詰まりやすいポイントをまとめます。どれも私が実際に踏んだものです。

① `/home/node/.n8n`に書こうとして失敗するケース

ここはn8nの内部データ用のパスです。セッションファイルや自作JSONを置こうとすると権限の問題が複雑になるため、別のマウントポイント(/filesなど)を用意するのが確実です。

確認項目:書き込み先は/home/node/.n8nか → YESなら別のマウントポイントを用意する

② `filesystem-v2`バイナリモードとの混同

Codeノードからバイナリデータを直接読もうとすると、dataフィールドに"filesystem-v2"という文字列が入っていて中身が取れないことがあります。バイナリの読み書きはRead/Write Filesノードに任せる設計にするのが無難です。

確認項目:Codeノードでバイナリを直接パースしようとしているか → YESならRead/Write Filesノードを使う

③ UID不一致でchownが効かないケース

ホスト側でchown 1000:1000を実行しても、コンテナ内のユーザーのUIDが異なる場合は効きません。以下で実際のUIDを確認してから設定してください。

docker exec n8n-n8n-1 id

uid=1000(node)と表示されれば1000で合っています。

この後どうなったか

書き込みが成功した後、同じ設計でセッションデータの読み込みも実装できました。フロー間でのデータ受け渡しが安定して動くようになり、n8nのWebhook受信→本文生成→WordPress自動投稿というパイプライン全体が動き始めています。

/files配下はDockerの再起動後も消えずに残るため、セッション管理用のJSONファイル置き場として安定して使えています。現在はこの設計で問題は出ていません。

まとめ

The file is not writableエラーの原因と解決をまとめます。

  • 原因:n8nのDocker環境が持つ内部のファイルアクセス制限
  • 解決:専用ボリュームマウントの追加 + N8N_RESTRICT_FILE_ACCESS_TOの設定
  • 注意:OS権限(chmod/chown)は直接の原因ではない

今日できる一歩は、docker-compose.ymlに/root/n8n/files:/filesのボリューム行を1行追加して再起動することです。まずそれだけ試してみてください。

ここまでの内容で、エラーの原因と対処の方向性は整理できたと思います。
ただし、このままだとDockerで自動化の仕組みを組んでいくときに、次に何でどこで詰まるかは判断できません
なぜなら、「何をどの順番で設計するか」という判断の軸が、まだ整理されていないからです。

無料PDFを受け取る

bizinets.biz

記事を読んで「もっと知りたい」と思ったあなたへ

bizinets.biz では、ビジネスの仕組みづくりを体系的に学べるコンテンツを用意しています。まずは一度、覗いてみてください。

bizinets.biz へ行く →

関連記事