根据 Docker 的理念 最终的软件应该是像一块块积木搭建起来的一样,加上 Rails 7 中对于 JS 依赖的解耦,现如今你们还会直接在 Dockerfile 中声明安装 NodeJs 的环境和相关的打包工具吗?毕竟 Rails production 环境的镜像最终只需要构建好的 assets 文件,如果这样搞好了,我感觉构建出来的镜像应该会简洁很多。
所以关于这一块有什么实践吗?有相关的文档吗?对于在 docker-compose 中如何搭配协作、先后顺序、文件互访这一块感觉还不太明了。
可以用 multi-stage 把构建过程分开,构建好之后把文件从 builder stage 拷贝到 production stage
https://docs.docker.com/develop/develop-images/multistage-build/
docker-compose 也支持指定需要构建到哪个 stage。
https://docs.docker.com/compose/compose-file/compose-file-v3/#target
不需要吧,你都用 docker 了,都是在里面构建好的呀
FROM ruby:3.0.3-alpine as build RUN apk add --update --no-cache build-base git fish nodejs yarn postgresql-dev libxml2-dev libxslt-dev tzdata ENV APP_HOME /app RUN mkdir $APP_HOME WORKDIR $APP_HOME # 安装 Ruby 依赖 COPY Gemfile* $APP_HOME/ COPY vendor/gems $APP_HOME/vendor/gems/ RUN bundle config set --local path 'vendor/bundle' RUN bundle install # 安装 Node.js 依赖 COPY package.json yarn.lock .npmrc $APP_HOME/ RUN yarn install --check-files # 编译 assets 并于完成后清理依赖 COPY . $APP_HOME RUN bin/vite build # 预先编译前端 RUN rm -rf $APP_HOME/node_modules FROM ruby:3.0.3-alpine RUN apk add --update --no-cache postgresql-dev libxml2-dev libxslt-dev tzdata libgit2 cmake fish COPY --from=build /app /app WORKDIR /app RUN bundle config set --local path 'vendor/bundle' RUN chmod +x docker/entrypoint_rails.sh CMD docker/entrypoint_rails.sh
供参考,编译完 assets 后,又把 node_modules 清理掉了,然后把项目 copy 过来。进入第二阶段构建。只安装 ruby 库相关的依赖。
https://github.com/work-design/docker
@Rei @mingyuan0715 非常感谢指点。
multi-stage 来就行 偷个懒也可以都打到一起