J'ai un processus dans mon Dockerfile
avec les étapes suivantes:
Le code suivant fonctionne jusqu'à ce que ffmpeg
version soit toujours 3.4.1. Donc, aujourd'hui, la version disponible pour ffmpeg
est 3.4.2 et le code ne fonctionne pas.
Je veux trouver un moyen de récupérer le nom du fichier après le processus untar et de le transmettre aux étapes suivantes.
RUN wget http://johnvansickle.com/ffmpeg/releases/ffmpeg-release-64bit-static.tar.xz
RUN tar xf ffmpeg-release-64bit-static.tar.xz
RUN mv ffmpeg-3.4.1-64bit-static/ffmpeg /usr/local/bin/
RUN mv ffmpeg-3.4.1-64bit-static/ffprobe /usr/local/bin/
Cela pourrait être quelque chose comme ça:
RUN DIRNAME = tar xf ffmpeg-release-64bit-static.tar.xz
RUN mv $DIRNAME/ffmpeg /usr/local/bin/
RUN mv $DIRNAME/ffprobe /usr/local/bin/
Comment pourrais-je y parvenir?
Ne pas Au lieu de cela, demandez à tar de placer le contenu dans un répertoire de votre choix.
tar
peut supprimer n composants du chemin de chaque fichier (--strip-components
)tar
peut appliquer des expressions sed arbitraires pour changer le chemin de chaque fichier (--transform
)Donc, je ferais quelque chose comme:
mkdir ffmpeg
wget -O - http://johnvansickle.com/ffmpeg/releases/ffmpeg-release-64bit-static.tar.xz |
tar --xz -x -C ffmpeg --strip-components=1
Ici, j’ai fait le répertoire moi-même et j’ai dit à tar d’y extraire (option -C
) tout en supprimant le premier composant du chemin des fichiers extraits. Ainsi, ffmpeg-3.4.1-64bit-static/ffprobe
devient ffprobe
dans le répertoire ffmpeg
.
Ou:
wget -O - http://johnvansickle.com/ffmpeg/releases/ffmpeg-release-64bit-static.tar.xz |
tar --xz -x --transform='s:[^/]*/:ffmpeg/'
Ici, j'ai simplement changé le premier composant du chemin en ffmpeg
, donc je n'avais pas besoin de créer le répertoire moi-même. Ainsi, ffmpeg-3.4.1-64bit-static/ffmpeg
devient ffmpeg/ffmpeg
.
Ou, sachant que vous souhaitez spécifiquement exporter ces fichiers particuliers dans /usr/local/bin
, utilisez -C
pour y placer directement les fichiers, tout en supprimant tous les composants du répertoire et en sélectionnant exactement les fichiers à extraire:
wget -O - http://johnvansickle.com/ffmpeg/releases/ffmpeg-release-64bit-static.tar.xz |
tar Jx -C /usr/local/bin --transform='s:.*/::' --wildcards '*/ffmpeg' '*/ffprobe'
Avec n'importe quel tar, vous pouvez spécifier les fichiers à extraire. Avec GNU tar, vous pouvez également utiliser des caractères génériques.
La commande pour obtenir le nom du répertoire à partir du fichier tar.xz
est la suivante:
tar tJvf tar-file-name.tar.xz | head -1 | awk '{print $6}'
Vous aurez besoin de:
Explication sur la façon d’obtenir le nom du répertoire à partir d’un fichier tar
:
Paramètres de goudron:
-f file
-J xz compression
-t list content
-v verbose
head -1
- imprime la ligne du fichier
awk '{print $6}'
- affiche le 6ème élément qui est le nom du répertoire
Exemples:
tar.xz
exemple:
tar tJvf coreutils-8.22.tar.xz | tête -1 | awk '{print $ 6}'
Résultats avec:
coreutils-8.22/
tar.bz2
exemple pour ffmpeg-3.4.2.tar.bz2
tar tjvf ffmpeg-3.4.2.tar.bz2 | tête -1 | awk '{print $ 6}'
Résultats avec:
ffmpeg-3.4.2/
Notez que pour
bz2
fichiers compressés, j'ai utilisé l'indicateurtar
j
.
Comme ça:
$ tar tf ffmpeg-release-64bit-static.tar.xz | head -1 | cut -d '/' -f1
ffmpeg-3.4.2-64bit-static
Notez que GNU tar
ne nécessite pas -j
, -z
etc., il peut détecter automatiquement le type d'archive.