はじめに
こんにちは!ミルディアの藤井です。Web業界では珍しく (?) Windows 大好きで、他のエンジニアとは環境が異なるためときどきハマることがあります。この記事では、Docker for Windows を使っていたときに遭遇した問題について、お話しします。
Docker for Windows で動かしていたのは Linux コンテナです。そのこと自体は問題ないかと思いますが、環境を構築する人 (DockerFile を書く人) のホスト OS が Linux だったために、OSが異なることに起因した問題が発生しました。
Case-Insensitive 問題
Windows のファイルシステム(NTFS)は、デフォルトで大文字小文字を区別しないため問題が起こります。遭遇したのは次のようなエラーでした。
File exists @ dir_s_mkdir - /app/tmp/cache/assets/sprockets/v3.0/ta
sprockets がホスト側にキャッシュフォルダをたくさん作るのですが、その名称が大文字小文字を区別したものなため、Windows では重複してしまってエラーになります。
解決方法その1
解決方法として一番簡単なのは、Windows のフォルダ単位で Case-Sensitive にしてしまう方法(*1,*2)。Windows 10 April 2018 Update 以降で有効です。
cmd.exe を管理者権限で起動し、次のコマンドを実行します。
fsutil.exe file setCaseSensitiveInfo C:(YOUR APP)\tmp\cache\assets\sprockets\v3.0
fsutil.exe file setCaseSensitiveInfo C:(YOUR APP)\storage
解決方法その2
sprockets のキャッシュパス設定を上書きしてしまう方法。キャッシュをコンテナの中に移動することで問題を解決します。
詳細は下記サイト(*3,*4)を見ていただくとして、ファイルを書き換えてしまうため Windows 以外の環境で再度動作確認をする必要があります。
参考にさせていただいたサイト:
*1 Per-directory case sensitivity and WSL
*2 [Docker for Windows] Sprockets のディレクトリ名がコンフリクトする場合 [Ruby on Rails]
*3 Windows+Docker+Railsでsprocketsのエラーが出る時
*4 FileStore cache patch in v3.6 causes directory name collisions in Windows
node_modules 問題
Windows と Linux とで node_modules フォルダの内容が異なることに起因してエラーとなります。たとえば次のようなエラーになります。
/usr/src/rails_app/node_modules/.bin/webpack: 1: /usr/src/rails_app/node_modules/.bin/webpack: XSym: not found
/usr/src/rails_app/node_modules/.bin/webpack: 2: /usr/src/rails_app/node_modules/.bin/webpack: 0025: not found
/usr/src/rails_app/node_modules/.bin/webpack: 3: /usr/src/rails_app/node_modules/.bin/webpack: 04ec15c01fc3c268b6405aedcd29653e: not found
/usr/src/rails_app/node_modules/.bin/webpack: 4: /usr/src/rails_app/node_modules/.bin/webpack: ../webpack/bin/webpack.js: not found
解決方法
.dockerignore ファイルに node_modules/ を追加します。これで Windows 用の node_modules フォルダがコンテナ内にコピーされることがなくなり、エラーが解消されます。
エラーが出たので対応できましたが、慎重に構成しないとビルドする環境によってイメージが異なってしまうということで、不具合を見逃す可能性があり怖いなと思いました。
参考にさせていただいたサイト:
*5 XSym: not found while executing binary in Docker on Windows
なんだかわからないエラー問題
Linux ホスト OS で動作確認済みの環境が、なんだかわからないエラーでビルド・実行出来ないことがあります。
こんなとき、まずは落ち着いて Docker を Restart しましょう。これで何度解決したことか。
Docker for Windows 卒業
複数人での開発において、ホスト OS が異なると作成されるイメージが同一にならない懸念がどうしてもぬぐえません。イメージが同一でないことに起因するアプリケーションの不具合にあたることはありませんでしたが、今後ないとはいえず、不安を払拭するため、デプロイでは Docker for Windows を卒業し VM の Linux 上で Docker を動かしています。トラブルフリーで幸せです。
まとめ
とはいえ手軽な Docker for Windows。コマンドプロンプトからサクッと動かせて、馴染みのコマンドで触れるのは魅力です。これからも仲良く付き合っていきたいと思います。