部署 使用 Docker 部署 Rails 程序的时候的一些 tips

jicheng1014 · 2016年05月20日 · 最后由 fsword 回复于 2016年05月20日 · 2941 次阅读

使用 docker 部署 rails 程序需要注意的地方

善用 docker 的缓存

由于我的项目使用了持续集成工具,每当合并到 develop 分支的时候集成工具就会自动帮我生成一个 image, 但在开发的时候,发现持续集成工具已经无法工作,进去一看,卡在了并发上面,由于每次 build 的时候都需要 bundle install, 所以在量大的时候这个地方就被卡住了。分析原因,原来是在 dockerfile 里出了问题,原来很粗暴的写成

ADD . /app
RUN bundle

由于 docker 在计算缓存的时候 add 和 copy 是要计算所添加的文件是否有变化,如果有变化就不用缓存的,这样导致了每次提交,都需要重新执行 bundle install,所以比较好的方案是,先拷贝 Gemfile 出去,之后 bundle install 之后再拷贝 add . /app

WORKDIR /app
ADD Gemfile* /app  # 记得 lock 也得拷贝进去
RUN bundle install
COPY . /app
CMD puma -C config/puma.rb

另外如果不是从 rails 的镜像,记得安装 bundler 和 rake

RUN gem install bundler rake

用环境变量,或者直接将配置 application.yml 挂出去

现在 settingslogic 基本每个项目都会用,这个 gem 对应的 yml 是可以使用 env 的

比如

production:
  <<: *defaults
  secret_key: <%= ENV["FLOW_SECRET_KEY"] ||"whosyourdaddy"%>

好处是到时候启动 docker 的时候,可以使用 -e 参数将其替换。或者更直接点,使用 -v 的形式挂载一个配置文件

记得改访问端口

如果使用调试模式运行 docker 里的 rails, 默认的 rails server 是只有 127.0.0.1 能够访问的,记得加上 -b 0.0.0.0

日志的查看

因为 docker 一旦结束运行,只要不是挂载的路径,都会被销毁,所以日志的处理比较麻烦。我比较喜欢直接点的将日志打到标准输出上,之后再使用 docker log 进行处理

config.logger = Logger.new(STDOUT)

都挺好,不过第一条这个看来是没有看 docker 官方的 ruby 镜像,其实那个很有参考价值

需要 登录 后方可回复, 如果你还没有账号请 注册新账号