yikegaya’s blog

仕事関連(Webエンジニア)と資産運用について書いてます

Rails+ECS環境でのassets:precompileのタイミング

ECS環境でRailsを動かす時にassets:precompileを実行するタイミングとして、最初とりあえずコンテナ起動時に実行してたのを、Dockerイメージをbuildする時に実行するように変更したんだけど割と面倒だったのでメモ。

configパス以下を読んでいるらしくconfig以下の環境変数がないと落ちる。

例えばこういうのがないと実行できない↓(database.yml)

  username: <%= ENV.fetch("DATABASE_USERNAME") %>
  password: <%= ENV.fetch("DATABASE_PASSWORD") %>

環境変数はS3からpullする構成にしていたので、コンテナ起動時に実行すると環境変数が読み込まれているんだけど、build時には環境変数をファイルから読むことができない。

Dockerfileはgitに入れたいしに機密情報書くのやだなー。。と思ってたけど、assets:precompileってフロントエンドのアセット作ってるだけで、DBの認証情報とか必要ないのでbuild時は適当な文字列入れておけば問題なく動いた。

以下Dockerfileに追記

ENV DATABASE_USERNAME dummy
ENV DATABASE_PASSWORD dummy

VOLUMEの指定方法を間違えてコンパイルしたアセットが消える

assets:precompileの結果をnginxのコンテナと共有するためにDockerfileの中でVOLUME指定してたんだけど、VOLUMEはassets:precompileの後に指定しないとホストの内容が反映されてしまうらしくコンパイル後のassetが残らない。

# OK
RUN bundle exec rake assets:precompile RAILS_ENV=production
VOLUME /app/rails/public

# NG
VOLUME /app/rails/public
RUN bundle exec rake assets:precompile RAILS_ENV=production

これもコンテナ実行時にassets:precompileするとassetが消えずに残るので正常に起動できるが、build時だと消える。

地味に嫌だったなこれ。