render.comでデプロイを(手動で)実行した際、
/usr/bin/env: ‘bash\r’: No such file or directory
というエラーが出た場合の対処案です。
render-build.shのファイルフォーマットをunix
にします。
(改行コードをLFにします。)
ログに上記のようなエラー(bashの後に\r
がある)場合は、ファイルフォーマットを見直してみてください。
環境
- OS: Windows11
- rails
- editor: gVim9
不具合内容
Railsチュートリアルの第6章をやっているときに発生しました。
Render.comのサイト上でBuild Commandを設定し、シェルスクリプトを渡した際にデプロイが失敗しました。
この作業は本番環境のRender.comで自作したWebアプリを実際に構築する、手順書をbinに入れたrender-build.shに指定しています。
この状態でデプロイが失敗し下記のログが出力されました。
(日時) ==> Cloning from https://github.com/...
(日時) ==> Checking out commit ... in branch main
(日時) ==> Downloading cache...
(日時) ==> Running build command 'bin/render-build.sh'... // bin/にあるrender-build.shを実行します。
(日時) /usr/bin/env: ‘bash\r’: No such file or directory // ん?そんなファイル(or ディレクトリ)はないよ。
(日時) ==> Build failed 😞 // 残念ながら失敗です。
(日時) ==> Generating container image from build. This may take a few minutes...
(日時) ==> Transferred 99MB in 8s. Extraction took 3s.
ログの下から4行目に
/usr/bin/env: ‘bash\r’: No such file or directory
とあります。bashの後ろに\r
とありますので、ここがエラーの原因だと思われます。
bashを呼び出すようにこちらは指定しているつもりですが、bash\rを呼び出そうとしてそんなファイルはないよと言っているようです。
render-build.shをWindowsのgVimで作成しました。改行コードはWindowsに合わせてCR+LFにしています。
Render.comはLinuxなのかはわかりませんが、CRLFのLFのみが改行として認識し、CRが残されたというのが私の推測です。
解決策
render-build.shの改行コードをCR+LFからLFにします。
vimではファイルフォーマットを(dosから)unixにすることで改行コードが変更されます。
:set fileformat? " 現在のファイルフォーマットを確認します。
:set fileformat=unix " dosになっていたらunixに変更する
:w " ファイルフォーマットの変更は保存したタイミングで行われるので保存します。
修正したファイルをGitHubにpushし、Render.comでデプロイを実行します。
おわり
上記に記したデプロイが失敗する原因はあくまでも私の推測です。
詳しい方がいらっしゃいましたらご教授いただければ幸いです。
もしかしたら改行コードが問題ではなかったかもしれませんが、何度かファイルフォーマットをdosとunixを切り替えてデプロイをしてみましたが、dosだと失敗し、unixだと通ることは確認しています。
追記
Railsチュートリアルは最後まで行い、完成版のデプロイも済んでいますが、render-build.sh以外にファイルフォーマットが問題になったことはありませんでした。他のファイルはすべてdos形式です。
また、ファイルフォーマット(fileformat: 改行コード)に似ている、エンコーディング(fileencoding)についてですが、私はすべてutf-8にしています。
Windowsのvimでは設定によってはファイルがcp932やutf-8が自動で設定されることがあります。
日本語が含まれていないファイルはutf-8になり、一文字でも日本語(全角文字)が入るとcp932になってしまうなどです。
cp932だとrailsのテストの段階で指摘されると思いますので、デプロイの失敗にはつながらないと思いますが、文字化けが発生したらエンコーディングを疑ってみてください。