ruby - Ruby在Java中是否具有等效的JAR文件?尝试减小Docker镜像的大小

标签 ruby docker

我正在容器化ruby应用程序(不精通Ruby)。安装所有相关依赖项后,我的docker镜像大小为1.18GB。我当时正在实现多阶段构建,这就是我的Dockerfile现在的样子。

FROM ruby:2.5.1 as builder
WORKDIR /usr/src/app
ADD . /usr/src/app
RUN bundle install --full-index

FROM ruby:2.5.1 as runner
EXPOSE 36081
ADD docker/config/env_config.rb /etc/flo
WORKDIR /usr/src/app
COPY --from=builder /usr/src/app/ /usr/src/app/
COPY --from=builder /usr/local/bundle/ /usr/local/bundle/
ENTRYPOINT /usr/src/app/docker-entrypoint.sh
但是我只能将其减少到917 MB。我正在尝试进一步减小此大小,并且想知道Ruby是否具有我不知道的JAR副本?基本上,如何减少从/usr/local/bundle/目录复制所有Gems的大小。

最佳答案

标准Docker Hub ruby image基于 buildpack-deps image,它包含大量的仅构建时依赖项,例如C头文件。该基础镜像本身约为300 MB,并一直传递到ruby镜像。在实际的运行时镜像中使用较小的镜像会有所帮助:

FROM ruby:2.5.1 AS builder # use the full image for building gems
...

FROM ruby:2.5.1-slim # but a reduced image for the final application
COPY --from=builder ...
Ruby具有.gem文件的概念,但它只是/usr/local/bundle树中内容的打包副本。
另一个特别可能的空间来源是Bundler使用的vendor目录树。您可以将vendor包含在.dockerignore文件中,以使其完全不发送到docker build(更好);或者,您可以在第一阶段RUN rm -rf /usr/src/app/vendor删除它(如果碰巧出现)。
无论如何,您可以通过在Dockerfile的末尾将ENTRYPOINT更改为CMD,然后更改docker run --rm -it your-image bash来进一步调试发生的情况。这将为您提供一个基于构建图像的新容器中的交互式 shell ,并且您可以使用du之类的工具环顾四周,以查找空间的去向。

关于ruby - Ruby在Java中是否具有等效的JAR文件?尝试减小Docker镜像的大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64376824/

相关文章:

ruby - 在 Ruby 中实现循环的最聪明和最有效的方法

docker - 将链接docker容器与网络混合

linux - Docker升级问题cent os 6.5

docker - 通过docker访问的Swagger UI不起作用

python - MLFlow 和 Hydra 一起使用会导致崩溃

docker - Jenkins:在Windows上构建并推送Docker镜像

Ruby - 查找子数组索引

mysql - 跨多列的续集唯一验证

ruby - 是否有任何工具可以检测在不同 ruby​​ 版本中表现不同的代码?

arrays - 如何从数组末尾删除 nil 或空元素?