Как распаковать .tar.zst?

в настоящее время работаю над задачей, где мне нужно настроить существующий файл 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

Что произойдет, если вы попытаетесь рассматривать этот файл как каталог в вашей локальной системе? Попробуйте cd cpython-*-x86_64-unknown-linux-gnu-pgo-*.tar.zst и посмотрите, что произойдет. Как это выглядит, когда вы ls -l cpython-*-x86_64-unknown-linux-gnu-pgo-*.tar.zst локально?

JNevill 18.04.2024 17:46

@JNeville Спасибо за быстрый ответ! Ваше первое предположение показывает, что .tar.zst не является каталогом. Второй дает: -rwxrwxrwx 1 pmb pmb 49949978 Apr 18 13:19 cpython-3.12.2+20240224-x86_64-unknown-linux-gnu-pgo-full.ta‌​r.zst

Pascal Michael Bayer 18.04.2024 17:54

Полезная информация. Есть ли в вашем локальном каталоге более одного файла, который соответствует этим подстановочным знакам? Мне тоже интересно, даже если он только один, поскольку есть подстановочные знаки, команда ADD может предполагать, что в изображение может быть передано более одного файла, и поэтому создает python.tar.zst как каталог для их перехвата. Я бы поставил на это свои деньги, если бы был игроком.

JNevill 18.04.2024 17:56

Документация подтверждает мое предположение: «Если указано несколько ресурсов <src>, напрямую или из-за использования подстановочного знака, то <dest> должен быть каталогом, и он должен заканчиваться косой чертой /». docs.docker.com/reference/dockerfile/#add

JNevill 18.04.2024 17:59

Там также указано это, но я не думаю, что это включает unzstd: «Если <src> — это локальный tar-архив в признанном формате сжатия (identity, gzip, bzip2 или xz), то он распаковывается как каталог. Ресурсы с удаленных URL-адресов не распакованы».

JNevill 18.04.2024 18:00

Это хорошая мысль! У меня есть файл оболочки, который извлекает файлы 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

Pascal Michael Bayer 18.04.2024 18:04

Я читал одно и то же о нескольких источниках, но поскольку всегда извлекается только один tar.zst, я бы подумал, что это сюда не применимо.

Pascal Michael Bayer 18.04.2024 18:07

Определенно странные вещи из документации. Согласно документации, исключение завершающего / вызовет ошибку (если бы он создавал каталог), но почти наверняка каталог создается И не выдает ошибку. Боюсь, мне не хватает опыта в этом вопросе. Любопытно, что может сделать RUN unzstd /input/python.tar.zst/cpython-3.12.2+20240224-x86_64-unknown‌​-linux-gnu-pgo-full.‌​tar.zst или как будет выглядеть этот каталог, если вы завершите свой dockerfile непосредственно перед unzstd и поместите его в работающий контейнер.

JNevill 18.04.2024 19:01
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
8
481
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я стиснул зубы и сыграл с 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, как мне решить эту проблему?

Pascal Michael Bayer 19.04.2024 08:01

Ответ правильный, я попробовал выполнить все шаги локально, и они работают нормально, просто в скрипте они не работают.

Pascal Michael Bayer 19.04.2024 08:19

Извините, я плохо разбираюсь в докере (никогда им не пользовался). Что произойдет, если заключить RUN unzstd /input/python.tar.zst -o ./python.tar в кавычки? RUN "unzstd /input/python.tar.zst -o ./python.tar"? @ПаскальМайклБайер

tink 19.04.2024 08:36

Попробовал, все равно выдает ошибку: /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

Pascal Michael Bayer 19.04.2024 08:57

@PascalMichaelBayer, как я уже сказал, я вообще не знаю докера. Хотя я тогда кое-что прочитал их документацию. Не могли бы вы попробовать использовать RUN ["unzstd", "/input/python.tar.zst", "-o", "./python.tar"]?

tink 19.04.2024 20:29

@PascalMichaelBayer Я решил твою проблему ;D

tink 20.04.2024 06:52

@PascalMichaelBayer предлагает что-нибудь сегодня? :)

tink 22.04.2024 06:55

Привет, Миш gibts noch :D Nutze das WE nur zum Abschalten. Итак, wie es jetzt - это функция, du bist ein wahrer Lebensretter, :) @tink

Pascal Michael Bayer 22.04.2024 08:03

@PascalMichaelBayer - достаточно справедливо; und frut mich, dir geholfen zu haben. ;)

tink 22.04.2024 09:09

Другие вопросы по теме