如何合并Docker的图像层并缩小图像文件

前端之家收集整理的这篇文章主要介绍了如何合并Docker的图像层并缩小图像文件 前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

Docker图片检查< name>
给我16GB

约20层

当我以root身份登录时,此
du -hs /
给我看看2GB

仅供参考,Dockerfile中已经有非常多行的RUN命令.

是否可以在不触摸Dockerfile,重建等的情况下将所有层压缩为一层?

或者可能通过向Dockerfile添加额外的操作来清除/改善缓存

Dockerfile是

  1. FROM heroku/heroku:18
  2. ENV PYENV_ROOT="/pyenv"
  3. ENV PATH="/pyenv/shims:/pyenv/bin:$PATH"
  4. ENV PYTHON_VERSION 3.5.6
  5. ENV GPG_KEY <value>
  6. ENV PYTHONUNBUFFERED 1
  7. ENV TERM xterm
  8. ENV EDITOR vim
  9. RUN apt-get update && apt-get install -y \
  10. build-essential \
  11. gdal-bin \
  12. binutils \
  13. iputils-ping \
  14. libjpeg8 \
  15. libproj-dev \
  16. libjpeg8-dev \
  17. libtiff-dev \
  18. zlib1g-dev \
  19. libfreetype6-dev \
  20. liblcms2-dev \
  21. libxml2-dev \
  22. libxslt1-dev \
  23. libssl-dev \
  24. libncurses5-dev \
  25. virtualenv \
  26. python-pip \
  27. python3-pip \
  28. python-dev \
  29. libMysqLclient-dev \
  30. MysqL-client-5.7 \
  31. libpq-dev \
  32. libcurl4-gnutls-dev \
  33. libgnutls28-dev \
  34. libbz2-dev \
  35. tig \
  36. git \
  37. vim \
  38. nano \
  39. tmux \
  40. tmuxinator \
  41. fish \
  42. sudo \
  43. libnet-ifconfig-wrapper-perl \
  44. ruby \
  45. libssl-dev \
  46. nodejs \
  47. strace \
  48. tcpdump \
  49. # npm & grunt
  50. && curl -L https://npmjs.com/install.sh | sh \
  51. && npm install -g grunt-cli grunt \
  52. # ruby & foreman
  53. && gem install foreman \
  54. # installing pyenv
  55. && curl https://raw.githubusercontent.com/yyuu/pyenv-installer/master/bin/pyenv-installer | bash
  56. COPY . /app
  57. COPY ./requirements /requirements
  58. COPY ./requirements.txt /requirements.txt
  59. COPY ./docker/docker_compose/django/foreman.sh /foreman.sh
  60. COPY ./docker/docker_compose/django/Procfile /Procfile
  61. COPY ./docker/docker_compose/django/entrypoint.sh /entrypoint.sh
  62. # ADD sudoer user django with password django
  63. RUN groupadd -r django -g 1000 && \
  64. useradd -ms /usr/bin/fish -p $(openssl passwd -1 django) --uid 1000 --gid 1000 -r -g django django && \
  65. usermod -a -G sudo django && \
  66. chown -R django:django /app
  67. COPY --chown=django:django ./docker/docker_compose/django/fish /home/django/.config/fish
  68. COPY --chown=django:django ./docker/docker_compose/django/tmuxinator /home/django/.tmuxinator
  69. COPY ./docker/docker_compose/django/fish /root/.config/fish
  70. WORKDIR /app
  71. RUN sed -i 's/\r//' /entrypoint.sh \
  72. && sed -i 's/\r//' /foreman.sh \
  73. && chmod +x /entrypoint.sh \
  74. && chown django /entrypoint.sh \
  75. && chmod +x /foreman.sh \
  76. && chown django /foreman.sh \
  77. && chown -R django:django /home/django/ \
  78. && pyenv install ${PYTHON_VERSION%%} \
  79. && mkdir -p /app/log \
  80. && pyenv global ${PYTHON_VERSION%%} \
  81. && pyenv rehash \
  82. && ${PYENV_ROOT%%}/versions/${PYTHON_VERSION%%}/bin/pip install -U pip \
  83. && ${PYENV_ROOT%%}/versions/${PYTHON_VERSION%%}/bin/pip install -r /requirements.txt \
  84. && chown -R django:django /pyenv/ \
  85. && ${PYENV_ROOT%%}/versions/${PYTHON_VERSION%%}/bin/pip install -r /requirements/dev_requirements.txt
  86. # this user receives ENVs from the top
  87. USER django
  88. ENTRYPOINT ["/entrypoint.sh"]

到目前为止,我已经尝试过:

来自docker build实验模式的–squash选项对我来说不是.该Dockerfile是docker-compose中的其他Dockerfile之一.

我也检查了一下:
https://github.com/jwilder/docker-squash

但似乎docker load无法加载压缩的图像.
另外,壁球给了我8GB(距离预期的2GB距离还很远)

  1. docker save <image_id> | docker-squash -t latest_tiny | docker load

回答后更新:

当我添加了这个:

  1. && apt-get autoremove \ # ? to consider
  2. && apt-get clean \ # ? to consider
  3. && rm -rf /var/lib/apt/lists/*

apt-get和–no-cache-dir到每个pip,结果是72GB(是的,甚至更多-docker图像在pip命令之前显示36GB,最终大小为72GB).

我的工作目录是明确的(关于COPY). du -hs /(作为root用户)仍然有2GB.并在重建之前删除了所有图像.

遵循@Mihai方法,我能够将映像从16GB缩小到9GB.

最佳答案
有一个简单的技巧可以摆脱中间层.它也将减小尺寸,但是多少取决于它的构建方式.

创建一个这样的Dockerfile:

  1. FROM your_image as initial
  2. FROM your_image_base
  3. COPY --from=initial / /

your_image_base应该类似于“ alpine”(高山)-因此,您的图片及其父级的最小图片.

现在构建图像并检查历史记录和大小:

  1. docker build -t your-image:2.0 .
  2. docker image history your-image:2.0
  3. docker image ls

这样,您无需触摸初始Dockerfile即可创建新的Dockerfile(如果您的过程可接受).

让我知道这是否解决了您的问题.

在查看Dockerfile之后进行更新:

也许我想念它,但执行安装后看不到您清理apt-get缓存.您的大型RUN命令应在同一行上以“&& rm -rf / var / lib / apt / lists / *”结尾,以便它不会将整个缓存存储在该层上.

猜你在找的Docker相关文章