我正在容器化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/