Я пытаюсь создать Dockerfile с содержимым ниже:
FROM openjdk:8-jdk-alpine
# working directory
WORKDIR /opt
# create directory for gatling install
RUN mkdir -p dir
# install
RUN apk add --update wget bash libc6-compat && \
mkdir -p /tmp/downloads && \
wget -q -O /tmp/downloads/file.zip https://repo1.maven.org/maven2/file.zip && \
mkdir -p /tmp/archive && \
cd /tmp/archive && \
unzip /tmp/downloads/file.zip && \
mv /tmp/archive/file/* /opt/file/ && \
rm -rf /tmp/*
# change context to file directory
WORKDIR /opt/file
# set directories below to be mountable from host
VOLUME ["/opt/file/conf", "/opt/file/results", "/opt/file/user-files"]
# set environment variables
ENV PATH /opt/path
ENV HOME /opt/HOME
ENTRYPOINT ["execScript.sh"]
Когда я запускаю эту команду: sudo docker build -t tag:name . я получил ошибку ниже:
ERROR: failed to solve: process "RUN apk add --update wget bash libc6-compat && \
mkdir ..." did not complete successfully: exit code: 139
Я использую чип Apple Mac M1, Arm64. Как мне решить эту проблему?
Отредактировано: я немного подправил, добавив RUN к каждой строке, оказалось, что ошибочной строкой была wget -q -O /tmp/downloads/file.zip https://repo1.maven.org/maven2/file.zip, регистрация была:
Dockerfile:22
--------------------
20 | RUN apk add --update wget bash libc6-compat
21 | RUN mkdir -p /tmp/downloads
22 | >>> RUN wget -q -O /tmp/downloads/file.zip https://repo1.maven.org/maven2/file.zip
23 | RUN mkdir -p /tmp/archive
24 | RUN cd /tmp/archive
--------------------
ERROR: failed to solve: process "/bin/sh -c wget -q -O /tmp/downloads/file.zip https://repo1.maven.org/maven2/file.zip" did not complete successfully: exit code: 139
Дальнейшая отладка путем перехода непосредственно в докер с помощью docker exec -it id sh, я получаю эту ошибку при повторном запуске всей команды:
/bin/sh -c wget -q -O /tmp/downloads/file.zip https://repo1.maven.org/maven2/file.zip
Оказывается, wget не может обнаружить всю часть -q -O /tmp/downloads/file.zip https://repo1.maven.org/maven2/file.zip в своей команде. Я пытался поставить эту команду wget в двойные галочки, но бесполезно.
Как отключить /bin/sh -c ?
1.220 (9/9) Installing wget (1.20.3-r0) 1.249 Executing busybox-1.29.3-r10.trigger 1.252 OK: 111 MiB in 61 packages 1.686 Segmentation fault @HansKilian, не мог бы ты взглянуть?
Имейте в виду, что базовому изображению пять лет. Вы уверены, что хотите использовать такое устаревшее изображение?
@NicoHaase сейчас я просто хочу сделать демо-версию, прежде чем смогу обновить ее версию, так что да...
Как и Нико, я подозреваю, что ваша проблема может быть связана с возрастом изображения. Я пытался найти другое изображение, которое вы могли бы использовать. Можете ли вы попробовать переключиться на openjdk:19-jdk-alpine и посмотреть, поможет ли это? Это самое новое изображение Alpine, которое я смог найти. Последние версии JDK недоступны в версии Alpine. Кроме того, изображения OpenJDK выглядят устаревшими согласно hub.docker.com/_/openjdk
@HansKilian Я немного подправил и понял, что проблема в строке wget, но попробуйте verbose показать только то, что соединение успешно установлено, и ничего больше, можете ли вы взглянуть на это? jdk все еще работает, но да, я изменю версию, как только это пройдет
Почему бы не разделить строки для дальнейшей отладки? Что вы подразумеваете под «ничего другого»? Пожалуйста, добавьте все пояснения к вашему вопросу, отредактировав его.
@NicoHaase Я обновил вопрос, посмотрите его.
«wget не может прочитать флаг» — что это значит?
@NicoHaase wget не может быть выполнен, извините за плохой английский. wget не может обнаружить параметры, указанные в командной строке. -q -O /tmp/downloads/file.zip https://repo1.maven.org/maven2/file.zip эта часть не обнаружена.
«невозможно обнаружить URL» — что это значит? Вы столкнулись с каким-либо сообщением об ошибке, которым вы могли бы поделиться? Также, насколько я вижу, эта проблема еще не связана с программированием
Давайте продолжим обсуждение в чате.


У вас есть пробелы после косых черт, удалите их.
ОБНОВЛЕНИЕ: проверял с помощью мобильного телефона, и после && \ в конце строки показывалось пробел. Это распространенная ошибка, приводящая к такого рода ошибкам.
Проверяя на рабочем столе, я не вижу места и каких-либо проблем с командами, но лучше начать с отдельных команд RUN, чтобы вы могли определить конкретную команду, которая вызывает ошибку, поэтому в вашем случае вам следует начать с
RUN apk add --update wget bash libc6-compat
RUN mkdir -p /tmp/downloads
RUN wget -q -O /tmp/downloads/file.zip https://repo1.maven.org/maven2/file.zip
RUN mkdir -p /tmp/archive
RUN cd /tmp/archive && unzip /tmp/downloads/file.zip
RUN mv /tmp/archive/file/* /opt/file/
RUN rm -rf /tmp/*
И если все хорошо, то объедините команды.
У меня нет места, только разрывная линия, это влияет на сценарий?
После каких слешей? Что заставляет вас думать, что это приводит к данному сообщению об ошибке?
Ваше «обновление» фактически аннулирует ответ и делает его бесполезным. Кроме того, недопустимое продолжение строки привело бы к концептуально другой ошибке, а не к сбою сегмента. Рассмотрите возможность его удаления.
Оказывается, проблема возникает из-за использования чипа Mac Apple, который был заменен на ПК с Windows с использованием того же Dockerfile, созданного без проблем. Только обновлен openjdk:19-alpine, но 8-alpine все еще работает!
Ошибка 139 — это ошибка сегментации. Попробуйте нажать
BUILDKIT_PROGRESS=plain sudo docker build -t tag:name ., чтобы получить журнал в более простом формате, который позволит вам увидеть причину этого.