Ruby Docker 项目中,yarn add 或 Gemfile 里添加新插件时的最佳实践应该是如何的?

wdrsam · 2021年07月23日 · 最后由 spike76 回复于 2021年07月26日 · 699 次阅读

我不确定各位在使用 docker 时候的最佳实践是怎么样的。这样 build 后没有问题,但每次我 yarn add 插件进去,我比如在我的 entrypoint 里启动 server 之前必须 yarn install 一下,或者重新 build。 总觉得这里方式不太对,请问下各位是如何处理的?同理,包括 Gemfile 中新加 gem 进去,都必须重新 build?

感觉本地开发挺浪费时间的。不然就是本地开发时在 entrypoint 里加启动 server 之前主动 yarn install 以及 bundle 一下,等做完要发布,把这两行删掉,丢上去重新 build。

Dockerfile

FROM ruby:2.6.3-alpine

ENV BUNDLER_VERSION=2.2.6

RUN apk add --update --no-cache \
      binutils-gold \
      build-base \
      curl \
      file \
      g++ \
      gcc \
      git \
      less \
      libstdc++ \
      libffi-dev \
      libc-dev \
      linux-headers \
      libxml2-dev \
      libxslt-dev \
      libgcrypt-dev \
      make \
      netcat-openbsd \
      nodejs \
      openssl \
      pkgconfig \
      postgresql-dev \
      python \
      tzdata \
      yarn

RUN gem install bundler -v 2.2.6
WORKDIR /app
COPY Gemfile Gemfile.lock ./
RUN bundle config build.nokogiri --use-system-libraries
RUN bundle check || bundle install
COPY package.json yarn.lock ./
RUN yarn install --check-files
COPY . ./
ENTRYPOINT ["./entrypoints/docker-entrypoint.sh"]

不懂就问:将应用放在宿主机,数据库、redis 之类的依赖放 docker,这种开发模式有什么风险么

spike76 回复

我用 docker 的目的之一是统一开发机的开发环境,如果应用跑在宿主机就做不到统一了,例如有的是 Linux,有的是 Mac,那么安装 imagemagick 等系统依赖,编译 gem 包的时候可能有差异。

风险的话,自己的应用还好,别人的应用要提防应用里面有恶意代码(例如盗取 ssh key)。我发现 vscode 有个好的功能是每次打开新项目会提示是否信任当前目录,如果不信任就不会运行一些需要运行代码的插件。

Rei 回复

谢谢回复,因为是在 wsl2 里开发,所以没有把应用放在 docker。你说的第二点倒是很有启发,难怪 vscode 每次都要提醒我

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