Dockerで作成した「debian:buster-slim」イメージで、Anchorの「A Minimal Example」を試していたら、solana-test-validatorするとUnable to connect to validatorというエラーが発生していた。
Macのローカル実行だと発生しなかったが、Dockerに入って実行すると発生した。
Agenda
現象
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