Как восстановить пространство в Docker Изображение после удаления файлов больше не нужно (java jdk 11 используется для создания jre) - PullRequest
1 голос
/ 23 апреля 2020

Я использую Docker с приложением Java, ранее я использовал Java 8 JRE , и мой общий размер docker был 163MB , затем я перешел к используйте Java 11 JRE и размер увеличен до 230MB , я бы предпочел не увеличивать размер, если это возможно.

Но Java 11 позволяет вам создать свой собственный JRE (используя jlink из JDK), содержащий только те модули, которые вам нужны. Поэтому я изменил свой DockerFile так, чтобы он основывался на JDK, а не на JRE, затем я использовал это для создания JRE только с теми модулями, которые мне были нужны, и создал это в папке своего приложения. Затем я использовал rm -fr /opt/java, чтобы удалить JDK, так как он мне больше не нужен, предполагая, что это уменьшит размер изображения, но это не значит, что изображение теперь 553MB . Мои приложения работают, но нет смысла использовать jlink, если я не могу уменьшить размер изображения, что я делаю не так?

Docker Файл ниже:

FROM adoptopenjdk/openjdk11:alpine

RUN apk --no-cache add \
      ca-certificates \
      curl \
      fontconfig \
      msttcorefonts-installer \
      tini \
 && update-ms-fonts \
 && fc-cache -f

RUN mkdir -p /opt \
 && curl http://www.jthink.net/songkong/downloads/build1114/songkong-linux-docker.tgz?val=130| tar -C /opt -xzf - \
&& find /opt/songkong -perm /u+x -type f -print0 | xargs -0 chmod a+x

RUN /opt/java/openjdk/bin/jlink --module-path=/opt/java/openjdk/jmods \
--add-modules java.desktop,java.datatransfer,java.logging,java.management,java.naming,java.net.http,java.prefs,java.scripting,java.sql,jdk.management,jdk.unsupported,jdk.scripting.nashorn \
--output /opt/songkong/jre

RUN rm -fr /opt/java

EXPOSE 4567

ENTRYPOINT ["/sbin/tini"]

# Config, License, Logs, Reports and Internal Database
VOLUME /songkong

# Music folder should be mounted here
VOLUME /music

WORKDIR /opt/songkong

CMD /opt/songkong/songkongremote.sh

Ответы [ 2 ]

2 голосов
/ 23 апреля 2020

Это нормально по природе docker изображения. Docker изображение основано на нескольких слоях, которые складываются вместе, и каждый слой является неизменным (не может обновить содержимое другого слоя).

Таким образом, когда файл создается в одном слое и удаляется в другом слое, файл все еще существует, но больше не доступен, и большинство инструкций в Dockerfile создают новый слой.

В вашем случае мы уменьшим ваше изображение до 3 слоя для демонстрации:

[Layer that remove the /opt/java folder]
[Layer with the new JRE]
[Base image with the JDK]

Но, в общем, ваше изображение имеет 3 слоя со всеми данными. Вы можете визуализировать его, запустив docker image history myimage, у вас будет список слоев и их размер.

Если вы хотите уменьшить размер, вам потребуется выполнить многоэтапную сборку: - Первый этап создания JRE - Второй этап импортирует JRE и добавляет к нему свой код

Каждый этап имеет различное базовое изображение, поэтому на втором этапе можно использовать небольшое базовое изображение:

# First stage - Create the JRE
FROM adoptopenjdk/openjdk11:alpine AS jre

RUN /opt/java/openjdk/bin/jlink --module-path=/opt/java/openjdk/jmods \
--add-modules java.desktop,java.datatransfer,java.logging,java.management,java.naming,java.net.http,java.prefs,java.scripting,java.sql,jdk.management,jdk.unsupported,jdk.scripting.nashorn \
--output /opt/songkong/jre

# Second stage
FROM alpine
RUN apk --no-cache add \
      ca-certificates \
      curl \
      fontconfig \
      msttcorefonts-installer \
      tini \
 && update-ms-fonts \
 && fc-cache -f

COPY --from=jre /opt/songkong/jre /opt/songkong/jre

RUN mkdir -p /opt \
 && curl http://www.jthink.net/songkong/downloads/build1114/songkong-linux-docker.tgz?val=130| tar -C /opt -xzf - \
&& find /opt/songkong -perm /u+x -type f -print0 | xargs -0 chmod a+x

EXPOSE 4567

ENTRYPOINT ["/sbin/tini"]

# Config, License, Logs, Reports and Internal Database
VOLUME /songkong

# Music folder should be mounted here
VOLUME /music

WORKDIR /opt/songkong

CMD /opt/songkong/songkongremote.sh

Для получения дополнительной информации. информация о многоступенчатой ​​сборке: https://docs.docker.com/develop/develop-images/multistage-build/

Для получения дополнительной информации об изображении и слоях: https://docs.docker.com/storage/storagedriver/#images -и-слои

0 голосов
/ 23 апреля 2020

Я прочитал немного и теперь понимаю, что каждый слой построен поверх другого. Поскольку / opt / java создается как часть базового слоя, он всегда будет существовать на изображении, даже если я удалю его на более позднем слое.

Вместо этого мне нужно выполнить многоступенчатые сборки в результате чего я строю свой jre в один этап, а затем на втором этапе на основе базового образа без jdk, я могу просто скопировать jre, созданный на первом этапе, во второй этап

Я обнаружил, что статья объясняет вещи довольно хорошо.

https://medium.com/@greut / java11-jlink-and- docker -2fec885fb2d

Но у меня была одна проблема: базовый альпийский: 3.11 образ не может работать Java из коробки я набрал строку из doptopenjdk/openjdk11:alpine-jre для установки различных дополнительных пакетов, но я не знаю, какие из них необходимы для запуска java с предоставленной jre, так что я, вероятно, установил много.

FROM adoptopenjdk/openjdk11:alpine AS build

RUN /opt/java/openjdk/bin/jlink --module-path=/opt/java/openjdk/jmods \
--add-modules java.desktop,java.datatransfer,java.logging,java.management,java.naming,java.net.http,java.prefs,java.scripting,java.sql,jdk.management,jdk.unsupported,jdk.scripting.nashorn \
--output /opt/songkong/jre

RUN apk --no-cache add \
      curl \
      tini

RUN mkdir -p /opt \
 && curl http://www.jthink.net/songkong/downloads/build1114/songkong-linux-docker.tgz?val=131| tar -C /opt -xzf - \
&& find /opt/songkong -perm /u+x -type f -print0 | xargs -0 chmod a+x

RUN rm -fr /opt/java

FROM alpine:3.11

ENV LANG='en_US.UTF-8' LANGUAGE='en_US:en' LC_ALL='en_US.UTF-8'

RUN apk add --no-cache --virtual .build-deps curl binutils \
    && GLIBC_VER="2.31-r0" \
    && ALPINE_GLIBC_REPO="https://github.com/sgerrand/alpine-pkg-glibc/releases/download" \
    && GCC_LIBS_URL="https://archive.archlinux.org/packages/g/gcc-libs/gcc-libs-9.1.0-2-x86_64.pkg.tar.xz" \
    && GCC_LIBS_SHA256="91dba90f3c20d32fcf7f1dbe91523653018aa0b8d2230b00f822f6722804cf08" \
    && ZLIB_URL="https://archive.archlinux.org/packages/z/zlib/zlib-1%3A1.2.11-3-x86_64.pkg.tar.xz" \
    && ZLIB_SHA256=17aede0b9f8baa789c5aa3f358fbf8c68a5f1228c5e6cba1a5dd34102ef4d4e5 \
    && curl -LfsS https://alpine-pkgs.sgerrand.com/sgerrand.rsa.pub -o /etc/apk/keys/sgerrand.rsa.pub \
    && SGERRAND_RSA_SHA256="823b54589c93b02497f1ba4dc622eaef9c813e6b0f0ebbb2f771e32adf9f4ef2" \
    && echo "${SGERRAND_RSA_SHA256} */etc/apk/keys/sgerrand.rsa.pub" | sha256sum -c - \
    && curl -LfsS ${ALPINE_GLIBC_REPO}/${GLIBC_VER}/glibc-${GLIBC_VER}.apk > /tmp/glibc-${GLIBC_VER}.apk \
    && apk add --no-cache /tmp/glibc-${GLIBC_VER}.apk \
    && curl -LfsS ${ALPINE_GLIBC_REPO}/${GLIBC_VER}/glibc-bin-${GLIBC_VER}.apk > /tmp/glibc-bin-${GLIBC_VER}.apk \
    && apk add --no-cache /tmp/glibc-bin-${GLIBC_VER}.apk \
    && curl -Ls ${ALPINE_GLIBC_REPO}/${GLIBC_VER}/glibc-i18n-${GLIBC_VER}.apk > /tmp/glibc-i18n-${GLIBC_VER}.apk \
    && apk add --no-cache /tmp/glibc-i18n-${GLIBC_VER}.apk \
    && /usr/glibc-compat/bin/localedef --force --inputfile POSIX --charmap UTF-8 "$LANG" || true \
    && echo "export LANG=$LANG" > /etc/profile.d/locale.sh \
    && curl -LfsS ${GCC_LIBS_URL} -o /tmp/gcc-libs.tar.xz \
    && echo "${GCC_LIBS_SHA256} */tmp/gcc-libs.tar.xz" | sha256sum -c - \
    && mkdir /tmp/gcc \
    && tar -xf /tmp/gcc-libs.tar.xz -C /tmp/gcc \
    && mv /tmp/gcc/usr/lib/libgcc* /tmp/gcc/usr/lib/libstdc++* /usr/glibc-compat/lib \
    && strip /usr/glibc-compat/lib/libgcc_s.so.* /usr/glibc-compat/lib/libstdc++.so* \
    && curl -LfsS ${ZLIB_URL} -o /tmp/libz.tar.xz \
    && echo "${ZLIB_SHA256} */tmp/libz.tar.xz" | sha256sum -c - \
    && mkdir /tmp/libz \
    && tar -xf /tmp/libz.tar.xz -C /tmp/libz \
    && mv /tmp/libz/usr/lib/libz.so* /usr/glibc-compat/lib \
    && apk del --purge .build-deps glibc-i18n \
    && rm -rf /tmp/*.apk /tmp/gcc /tmp/gcc-libs.tar.xz /tmp/libz /tmp/libz.tar.xz /var/cache/apk/*

RUN mkdir -p /opt

COPY --from=build /opt/songkong /opt/songkong

RUN apk --no-cache add \
      ca-certificates \
      curl \
      fontconfig \
      msttcorefonts-installer \
      tini \
 && update-ms-fonts \
 && fc-cache -f

EXPOSE 4567

ENTRYPOINT ["/sbin/tini"]

# Config, License, Logs, Reports and Internal Database
VOLUME /songkong

# Music folder should be mounted here
VOLUME /music

WORKDIR /opt/songkong

CMD /opt/songkong/songkongremote.sh
...