VS Code + dockerの環境で"Goのバイナリが見つからない"とエラーが出た件

goenvでGoのバージョン管理をしている環境で、VS codeでコード修正とデバッグしようとしたところ下記のようなエラーが発生しました。

Cannot find "go" binary. Update PATH or GOROOT appropriately.

また、VS codeのターミナルを使おうとすると、下記のようなエラーも発生します。

Failed to find the "go" binary in either GOROOT() or PATH(/root/.vscode-server/bin/fd6f3bce6709b121a895d042d343d71f317d74e7/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/local/go/bin).Check PATH, or Install Go and reload the window. If PATH isn't what you expected, see https://github.com/golang/vscode-go/issues/971

ソリューション

接続先コンテナのsettings.jsonに下記を追記します。

{
    "go.goroot": "/root/.goenv/versions/1.16.0",
    "go.gopath": "/root/go/1.16.0",
    "terminal.integrated.shellArgs.linux": [
        "-l"
    ]
}

go.goroot、go.gopath

GOROOTとGOPATH設定をします。

上記の環境変数は go env GOROOTgo env GOPATH で確認できます。

terminal.integrated.shellArgs.linux

この設定に"-l" を指定すると、接続先の.bash_profileを読み込んでbashを起動できます。

私の環境ではdockerのコンテナに対してVS Codeでリモート接続しており、GOROOTやGOPATHの設定は接続先コンテナの.bash_profileに記述していました。そのため、vscodeのターミナルを開いた際、この.bash_profileの設定が読み込まれていないようだったため、 terminal.integrated.shellArgs.linux の設定を追記しました。

You can pass arguments to the shell when it is launched.

For example, to enable running bash as a login shell (which runs .bash_profile), pass in the -l argument (with double quotes):

https://code.visualstudio.com/docs/editor/integrated-terminal#_shell-arguments

まとめ

普段使いはVimですが、デバッグ周りはどうしても他のエディターの方が使いやすいので、時々VS Codeを使いたくなるのです。