Dockerでsolana-test-validatorするとUnable to connect to validatorエラー

Dockerで作成した「debian:buster-slim」イメージで、Anchorの「A Minimal Example」を試していたら、solana-test-validatorするとUnable to connect to validatorというエラーが発生していた。

Macのローカル実行だと発生しなかったが、Dockerに入って実行すると発生した。

現象

solana-test-validatorでエラーが表示される。

root@963cae04fa02:/usr/src/app/anchor-master# solana-test-validator
Ledger location: test-ledger
Log: test-ledger/validator.log
⠒ Unable to connect to validator: Client error: test-ledger/admin.rpc does not exist

なお、このエラーを無視してそのまま利用することも一応できた。

原因

solana-test-validatorを起動すると、実行したディレクトリにtest-ledgerフォルダが自動生成されるのだが、それがうまくいっていない(?)ケースに発生するエラーとのこと。

Issuesを読むと、Dockerのマウント場所(ボリューム)の関係らしい。
たとえば、以下のようなDockerfileがあった場合、volumesが「/usr/src/app」になっているため、そのディレクトリ配下(/usr/src/appの自身を除く、その配下のディレクトリ)でsolana-test-validatorを実行するとエラーが発生した。
逆に、このディレクトリ配下以外のディレクトリ(/usr/src/appやそれ以外のディレクトリ)で実行した場合はエラーが発生しなかった。

Dockerfile

version: '3'
services:
  app:
    build: .
    volumes:
      - .:/usr/src/app
    ports:
      - "3000:3000"
    stdin_open: true

たとえば、以下のような形になる。

  • /usr/src/app ← ここでの実行はOK
  • /usr/src/app/programs ← ここでの実行はNG
  • /usr/src/app/tests ← ここでの実行はNG
  • /root/ ← ここでの実行はOK

対策

DockerfileのVolumesで指定したディレクトリ以外の場所で実行する。
たとえば、ホームディレクトリに移動してsolana-test-validatorを起動する、など。

root@963cae04fa02:/usr/src/app/anchor-master# cd ~
root@963cae04fa02:~# solana-test-validator
Ledger location: test-ledger
Log: test-ledger/validator.log
Identity: 5DaZPpwxiRVWYRAVJjwfgzkAz6MeDV4gpkzyi1LxDPoU
Genesis Hash: Da251XrZMqbn9kEzXsLs8SeXWxbtF8MrxkEzprA7cSpc
Version: 1.8.0
Shred Version: 32829
Gossip Address: 127.0.0.1:1024
TPU Address: 127.0.0.1:1027
JSON RPC URL: http://127.0.0.1:8899
⠠ 00:00:10 | Processed Slot: 20 | Confirmed Slot: 20 | Finalized Slot: 0 | Snaps

参考

solana-test-validator Unable to connect to validator: Client error: test-ledger/admin.rpc does not exist #294