Czy ktoś z Was spotkał się już może z problemem automatycznego przeładowywania kodu w środowisku developerskim Rails postawionym na Dockerze? Generalnie problem polega na tym, że pracując na Linuksie przeładowywanie kodu działa poprawnie, tj. zmieniając np. zawartość jakiegoś tłumaczenia, zmiany są od razu widoczne w aplikacji, nie trzeba restartować serwera. Natomiast korzystając z Docker for Windows ten mechanizm nie działa. Domyślam się, że ma to związek z dodatkową linuxową wirtualką, jaką to narzędzie siłą rzeczy musi postawić.
Próbowałem nawet wyłączać file_watcher w konfiguracji development.rb, ale niestety nie przyniosło to żadnego efektu.
Hej,
stworz katalog z paroma plikami i uruchom w nim: docker run --name testfs -d -p 8080:8080 -vpwd:/data visualjeff/simple-http-server:0.0.1
Po czym dodaj pliki w tym katalogu i zobacz czy sie tez dodaly pod localhost:8080. Jesli sa widoczne, to trzeba kombinowac dalej, jesli nie - ktorys filesystem jest nieporawnie zamontowany (host - virtualka albo virtualka - host).
Na Windzie ta komenda nie zadziała z Git Bash, trzeba użyć windowsowej konsoli (ja użyłem PS) i podać absolutną ścieżkę pwd w windowsowym formacie - to tak dla przyszłych czytających
Po uruchomieniu tego serwera widać zmiany w plikach “w locie”, więc trzeba kombinować dalej. Musi istnieć na to jakiś workaround ale poza config.file_watcher nic innego już mi nie przychodzi do głowy.
Na OSX wspomniany problem nie występuje, tylko mi się wydawało (sprawdzałem szybko na nie swoim komputerze, teraz postawiłem to wszystko na spokojnie od zera, zarówno na OSX, Win i Linuksie). Zrobiłem porządek w tytule.
Tu jest całkiem fajny opis jak działa reload w trybie dev http://crypt.codemancers.com/posts/2013-10-03-rails-reloading-in-dev-mode/. Wprawdzie opisuje rails 4, ale w tej kwestii chyba się nic nie zmieniło w rails 5. Mechanizm ten m.in. porównuje timestampy. Może jest jakiś rozjazd między timestampami plików, które są aktualizowane pod windowsem a czasem (zegar) jaki widzi proces rubiego w dockerze?
Tak, to zdecydowanie ma związek z timestampami. Na Linuksie i OSX Time.now dodane w widoku appki pokazuje prawidłową godzinę (w GMT), natomiast na Windows czas jest z kosmosu. Pokazuje kilkanaście godzin wstecz, nawet minuty się nie zgadzają.
Na 99% jest to czas który synchronizuje ze swoją wbudowaną VM’ką, ustawić go na aktualny można jedynie restartem Docker for Windows, ale to oczywiście nie pomaga, bo pewnie timestampy plików się nie zmieniają. Niestety nie wiem jak mógłbym się zalogować na tą pośredniczącą maszynę, ani nawet do kontenera na Windowsie (interactive mode is not supported on Windows yet ). Na OSX timestampy zmieniają się prawidłowo.
Wygląda na to, że to błąd w Docker for Windows i na ten moment pozostaje jedynie mieć świadomość tego problemu i restartować serwer, gdy zajdzie taka potrzeba. Na szczęście z tego co zaobserwowałem problem ogranicza się do plików tłumaczeń - przeładowywanie klas i route’ów działa prawidłowo.