в настоящее время работаю над задачей, где мне нужно настроить существующий файл docker, чтобы создать новый .tar.gz для Python 3.12.2, и, честно говоря, я в тупике. Вот используемый скрипт:
# The same base image as the jenkins agents
FROM openjdk:17-jdk-bullseye
# install tools we need
WORKDIR /package-install
ADD zstd_*_amd64.deb zstd.deb
RUN dpkg -i zstd.deb
# insert the input packages
WORKDIR /input
ADD cpython-*-x86_64-unknown-linux-gnu-pgo-*.tar.zst python.tar.zst
# re-compress the tar archive
WORKDIR /build
RUN unzstd /input/python.tar.zst -o ./python.tar
RUN gzip -k ./python.tar
# prepare the output file
RUN cp ./python.tar.gz /python.tar.gz
RUN chmod a=rw /python.tar.gz
# declare the export
VOLUME /export
WORKDIR /
# this will be executed when the container starts
CMD [ "cp", "-va", "/python.tar.gz", "/export/" ]
Сценарий завершается сбоем при выполнении команды unzstd и сообщает мне, что он не может выполнить задачу, поскольку предположительно python.tar.zst является каталогом.
Ничто из того, что я нашел до сих пор, не помогло мне решить эту проблему. Если у вас есть идеи, что вызывает эту проблему и как ее исправить, я буду рад вашему мнению.
С наилучшими пожеланиями Паскаль
Дополнительная информация: cpython-3.12.2+20240224-x86_64-unknown-linux-gnu-pgo-full.tar.zst — это рассматриваемый tar.zst.
После того, как я это узнал, я немного погуглил и нашел возможность добавить -r к команде, чтобы распаковать каждый файл внутри .tar.zst, но это привело к следующей ошибке:
The command '/bin/sh -c unzstd -r /input/python.tar.zst/ -o ./python.tar' returned a non-zero code: 1
@JNeville Спасибо за быстрый ответ! Ваше первое предположение показывает, что .tar.zst не является каталогом. Второй дает: -rwxrwxrwx 1 pmb pmb 49949978 Apr 18 13:19 cpython-3.12.2+20240224-x86_64-unknown-linux-gnu-pgo-full.tar.zst
Полезная информация. Есть ли в вашем локальном каталоге более одного файла, который соответствует этим подстановочным знакам? Мне тоже интересно, даже если он только один, поскольку есть подстановочные знаки, команда ADD
может предполагать, что в изображение может быть передано более одного файла, и поэтому создает python.tar.zst
как каталог для их перехвата. Я бы поставил на это свои деньги, если бы был игроком.
Документация подтверждает мое предположение: «Если указано несколько ресурсов <src>, напрямую или из-за использования подстановочного знака, то <dest> должен быть каталогом, и он должен заканчиваться косой чертой /». docs.docker.com/reference/dockerfile/#add
Там также указано это, но я не думаю, что это включает unzstd
: «Если <src> — это локальный tar-архив в признанном формате сжатия (identity, gzip, bzip2 или xz), то он распаковывается как каталог. Ресурсы с удаленных URL-адресов не распакованы».
Это хорошая мысль! У меня есть файл оболочки, который извлекает файлы tar.zst и .deb из удаленного репозитория Nexus, и в результате моего тестирования действительно осталось несколько дубликатов. К сожалению, после их удаления ошибка не исчезла: zstd: /input/python.tar.zst is a directory -- ignored The command '/bin/sh -c unzstd /input/python.tar.zst -o ./python.tar' returned a non-zero code: 1
Я читал одно и то же о нескольких источниках, но поскольку всегда извлекается только один tar.zst, я бы подумал, что это сюда не применимо.
Определенно странные вещи из документации. Согласно документации, исключение завершающего /
вызовет ошибку (если бы он создавал каталог), но почти наверняка каталог создается И не выдает ошибку. Боюсь, мне не хватает опыта в этом вопросе. Любопытно, что может сделать RUN unzstd /input/python.tar.zst/cpython-3.12.2+20240224-x86_64-unknown-linux-gnu-pgo-full.tar.zst
или как будет выглядеть этот каталог, если вы завершите свой dockerfile непосредственно перед unzstd
и поместите его в работающий контейнер.
Я стиснул зубы и сыграл с docker
, самое время было, да?
В любом случае: оказывается, что докер невероятно глуп в своей умности. ADD
распознает tar-файлы и щедро распаковывает их для вас; ADD
также принимает в качестве места назначения только каталоги. Объединив эти две вещи, вы фактически получите каталог под названием python.tar.zst
, в котором находится каталог python
с вашим расширенным архивом.
Короче говоря, вы можете достичь своей реальной цели следующим образом:
# The same base image as the jenkins agents
FROM openjdk:17-jdk-bullseye
# install tools we need
WORKDIR /package-install
ADD zstd_*_amd64.deb zstd.deb
RUN dpkg -i zstd.deb
# insert the input packages
WORKDIR /input
ADD cpython-*-x86_64-unknown-linux-gnu-pgo-*.tar.zst /input
# re-compress the tar archive
WORKDIR /build
# prepare the output file
RUN tar cvzf python.tar.gz /input/python
RUN chmod a=rw python.tar.gz
# declare the export
VOLUME /export
WORKDIR /
# this will be executed when the container starts
CMD [ "cp", "-va", "/build/python.tar.gz", "/export/" ]
Спасибо за ваш ответ! Извините, но я не настолько разбираюсь в Linux, как мне решить эту проблему?
Ответ правильный, я попробовал выполнить все шаги локально, и они работают нормально, просто в скрипте они не работают.
Извините, я плохо разбираюсь в докере (никогда им не пользовался). Что произойдет, если заключить RUN unzstd /input/python.tar.zst -o ./python.tar
в кавычки? RUN "unzstd /input/python.tar.zst -o ./python.tar"
? @ПаскальМайклБайер
Попробовал, все равно выдает ошибку: /bin/sh: 1: unzstd /input/python.tar.zst -o ./python.tar: not found The command '/bin/sh -c "unzstd /input/python.tar.zst -o ./python.tar"' returned a non-zero code: 127
@tink
@PascalMichaelBayer, как я уже сказал, я вообще не знаю докера. Хотя я тогда кое-что прочитал их документацию. Не могли бы вы попробовать использовать RUN ["unzstd", "/input/python.tar.zst", "-o", "./python.tar"]
?
@PascalMichaelBayer Я решил твою проблему ;D
@PascalMichaelBayer предлагает что-нибудь сегодня? :)
Привет, Миш gibts noch :D Nutze das WE nur zum Abschalten. Итак, wie es jetzt - это функция, du bist ein wahrer Lebensretter, :) @tink
@PascalMichaelBayer - достаточно справедливо; und frut mich, dir geholfen zu haben. ;)
Что произойдет, если вы попытаетесь рассматривать этот файл как каталог в вашей локальной системе? Попробуйте
cd cpython-*-x86_64-unknown-linux-gnu-pgo-*.tar.zst
и посмотрите, что произойдет. Как это выглядит, когда выls -l cpython-*-x86_64-unknown-linux-gnu-pgo-*.tar.zst
локально?