gpt4 book ai didi

docker - 如何合并Docker的镜像层并瘦身镜像文件

转载 作者:行者123 更新时间:2023-12-01 14:45:17 24 4
gpt4 key购买 nike

docker image inspect <name>给我 16GB

大约20层

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

仅供引用,Dockerfile 中已经有非常多行的 RUN 命令。

我可以将所有层压缩成一层吗没有 触摸 Dockerfile,重建等?

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

FROM heroku/heroku:18

ENV PYENV_ROOT="/pyenv"
ENV PATH="/pyenv/shims:/pyenv/bin:$PATH"
ENV PYTHON_VERSION 3.5.6
ENV GPG_KEY <value>
ENV PYTHONUNBUFFERED 1
ENV TERM xterm
ENV EDITOR vim

RUN apt-get update && apt-get install -y \
build-essential \
gdal-bin \
binutils \
iputils-ping \
libjpeg8 \
libproj-dev \
libjpeg8-dev \
libtiff-dev \
zlib1g-dev \
libfreetype6-dev \
liblcms2-dev \
libxml2-dev \
libxslt1-dev \
libssl-dev \
libncurses5-dev \
virtualenv \
python-pip \
python3-pip \
python-dev \
libmysqlclient-dev \
mysql-client-5.7 \
libpq-dev \
libcurl4-gnutls-dev \
libgnutls28-dev \
libbz2-dev \
tig \
git \
vim \
nano \
tmux \
tmuxinator \
fish \
sudo \
libnet-ifconfig-wrapper-perl \
ruby \
libssl-dev \
nodejs \
strace \
tcpdump \
# npm & grunt
&& curl -L https://npmjs.com/install.sh | sh \
&& npm install -g grunt-cli grunt \
# ruby & foreman
&& gem install foreman \
# installing pyenv
&& curl https://raw.githubusercontent.com/yyuu/pyenv-installer/master/bin/pyenv-installer | bash

COPY . /app
COPY ./requirements /requirements
COPY ./requirements.txt /requirements.txt
COPY ./docker/docker_compose/django/foreman.sh /foreman.sh
COPY ./docker/docker_compose/django/Procfile /Procfile
COPY ./docker/docker_compose/django/entrypoint.sh /entrypoint.sh

# ADD sudoer user django with password django
RUN groupadd -r django -g 1000 && \
useradd -ms /usr/bin/fish -p $(openssl passwd -1 django) --uid 1000 --gid 1000 -r -g django django && \
usermod -a -G sudo django && \
chown -R django:django /app

COPY --chown=django:django ./docker/docker_compose/django/fish /home/django/.config/fish
COPY --chown=django:django ./docker/docker_compose/django/tmuxinator /home/django/.tmuxinator
COPY ./docker/docker_compose/django/fish /root/.config/fish

WORKDIR /app

RUN sed -i 's/\r//' /entrypoint.sh \
&& sed -i 's/\r//' /foreman.sh \
&& chmod +x /entrypoint.sh \
&& chown django /entrypoint.sh \
&& chmod +x /foreman.sh \
&& chown django /foreman.sh \
&& chown -R django:django /home/django/ \
&& pyenv install ${PYTHON_VERSION%%} \
&& mkdir -p /app/log \
&& pyenv global ${PYTHON_VERSION%%} \
&& pyenv rehash \
&& ${PYENV_ROOT%%}/versions/${PYTHON_VERSION%%}/bin/pip install -U pip \
&& ${PYENV_ROOT%%}/versions/${PYTHON_VERSION%%}/bin/pip install -r /requirements.txt \
&& chown -R django:django /pyenv/ \
&& ${PYENV_ROOT%%}/versions/${PYTHON_VERSION%%}/bin/pip install -r /requirements/dev_requirements.txt

# this user receives ENVs from the top
USER django

ENTRYPOINT ["/entrypoint.sh"]

到目前为止我尝试过的:
--squash来自 docker build 的实验模式的选项不适合我。该 Dockerfile 是 docker-compose 中的更多 Dockerfile 之一。

我也检查过这个:
https://github.com/jwilder/docker-squash

但似乎 docker load 无法加载压缩的图像。
另外,那个 Squash 给了我 8GB(离预期的 2GB 还很远)
docker save <image_id> | docker-squash -t latest_tiny | docker load

回答后更新:

当我添加了这个:
&& apt-get autoremove \             # ? to consider
&& apt-get clean \ # ? to consider
&& rm -rf /var/lib/apt/lists/*

apt-get--no-cache-dir对于每个点,结果是 72GB(是的,甚至更多 - docker imagespip 命令之前显示 36GB,最终大小为 72GB)。

我的工作目录很清楚(关于 COPY )。 du -hs / (作为根)仍然有 2GB。并且在重建之前删除了所有图像。

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

最佳答案

有一个简单的技巧可以摆脱中间层。它也会缩小尺寸,但多少取决于它是如何 build 的。

像这样创建一个 Dockerfile:

FROM your_image as initial

FROM your_image_base

COPY --from=initial / /
your_image_base应该是类似“alpine”的东西 - 所以你的图像和它的父级的最小图像。

现在构建图像并检查历史记录和大小:
docker build -t your-image:2.0 .
docker image history your-image:2.0
docker image ls

通过这种方式,您可以在不接触初始 Dockerfile 的情况下创建一个新的 Dockerfile(如果这对您的流程来说是可以接受的)。

如果这能解决您的问题,请告诉我。

看到 Dockerfile 后更新:

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

关于docker - 如何合并Docker的镜像层并瘦身镜像文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56117261/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com