Почему я получаю "unzip: short read", когда пытаюсь создать образ из Dockerfile?

Из книги Spring Microservices in Action: я пытаюсь использовать подключаемый модуль Docker Maven для создания образа Docker для развертывания микросервиса Java в качестве контейнера Docker в облаке.

Dockerfile:

FROM openjdk:8-jdk-alpine
RUN mkdir -p /usr/local/configserver
ADD jce_policy-8.zip /tmp/
RUN unzip /tmp/jce_policy-8.zip && \
    rm /tmp/jce_policy-8.zip && \
    yes | cp -v /tmp/UnlimitedJCEPolicyJDK8/*.jar /usr/lib/jvm/java-1.8-openjdk/jre/lib/security/
ADD @project.build.finalName@.jar /usr/local/configserver/
ADD run.sh run.sh
RUN chmod +x run.sh
CMD ./run.sh

Вывод, относящийся к шагу 4 в Dockerfile:

...

---> Using cache
---> dd33d4c12d29
Step 4/8 : RUN unzip /tmp/jce_policy-8.zip && rm /tmp/jce_policy-8.zip && yes | cp -v /tmp/UnlimitedJCEPolicyJDK8/*.jar /usr/lib/jvm/java-1.8-openjdk/jre/lib/security/

---> Running in 1071273ceee5
Archive:  /tmp/jce_policy-8.zip
unzip: short read

Почему я получаю unzip: short read когда я пытаюсь построить образ?

1 ответ

Каким-то образом, curl в дистрибутиве Alpine Linux не может правильно установить заголовки cookie при загрузке zce-файла jce. Кажется, что он загружает ZIP-файл, но на самом деле это страница с ошибкой HTML. Если вы просматриваете файл, вы видите, что это HTML-файл. Я использовал wget вместо curl, и он успешно загрузил файл. Затем операция распаковки работала как положено.

FROM openjdk:8-jdk-alpine
RUN  apk update && apk upgrade && apk add netcat-openbsd
RUN mkdir -p /usr/local/configserver
RUN cd /tmp/ && \
    wget 'http://download.oracle.com/otn-pub/java/jce/8/jce_policy-8.zip' --header "Cookie: oraclelicense=accept-securebackup-cookie" && \
    unzip jce_policy-8.zip && \
    rm jce_policy-8.zip && \
    yes |cp -v /tmp/UnlimitedJCEPolicyJDK8/*.jar /usr/lib/jvm/java-1.8-openjdk/jre/lib/security/
ADD @project.build.finalName@.jar /usr/local/configserver/
ADD run.sh run.sh
RUN chmod +x run.sh
CMD ./run.sh

Может быть, это связано с тем, что unzip Команда в alpine предоставляется busybox, а не стандартным инструментом распаковки.

Busybox действительно имеет ошибки, связанные с этой ошибкой: https://bugs.busybox.net/show_bug.cgi?id=8821

Вот связанная проблема с более подробной информацией: https://github.com/wahern/luaossl/issues/103

В качестве обходного пути установки стандарт unzip Команда должна работать.

Возможно, ваш jce_policy-8.zip архив распознается как сжатый архив и расширяется ADD инструкция. Если это так, вы можете пропустить разархивирование на следующей строке. Или переключитесь на COPY Инструкция, которая не занимается специальной обработкой локальных архивов.

В общем, я рекомендую всегда использовать COPY Инструкция по вводу файлов и каталогов из контекста сборки. Использовать только ADD когда вам конкретно нужно дополнительное поведение при распаковке.

Я нашел решенную ссылку

FROM openjdk:8-jdk-alpine
RUN  apk update && apk upgrade && apk add netcat-openbsd && apk add curl
RUN mkdir -p /usr/local/configserver
RUN cd /tmp/ && \
    **curl -L -b "oraclelicense=a" http://download.oracle.com/otn-pub/java/jce/8/jce_policy-8.zip -O** && \
    unzip jce_policy-8.zip && \
    rm jce_policy-8.zip && \
    yes |cp -v /tmp/UnlimitedJCEPolicyJDK8/*.jar /usr/lib/jvm/java-1.8-openjdk/jre/lib/security/
ADD @project.build.finalName@.jar /usr/local/configserver/
ADD run.sh run.sh
RUN chmod +x run.sh
CMD ./run.sh
Другие вопросы по тегам