Почему я получаю "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