1
votes

Dockerfile: Comment définir le miroir apt en fonction de la version ubuntu

Lors de la construction d'une image docker, il est possible de définir le miroir apt personnalisé en écrasant le /etc/apt/sources.list , par exemple

RUN apt-get update && apt-get install -y lsb-release

Si l'image de base est une variable, par exemple FROM ${DISTRO} , le sources.list doit être ajusté en fonction de la version ubuntu.

J'ai essayé $(lsb_release -cs) comme ci-dessous:

RUN echo "deb mirror://mirrors.ubuntu.com/mirrors.txt $(lsb_release -cs) main restricted universe multiverse" > /etc/apt/sources.list && \
    echo "deb mirror://mirrors.ubuntu.com/mirrors.txt $(lsb_release -cs)-updates main restricted universe multiverse" >> /etc/apt/sources.list && \
    echo "deb mirror://mirrors.ubuntu.com/mirrors.txt $(lsb_release -cs)-security main restricted universe multiverse" >> /etc/apt/sources.list

Mais il dit lsb_release: not found .

La solution de contournement consiste à installer le package avant de l'exécuter.

FROM ubuntu:focal

RUN echo "deb mirror://mirrors.ubuntu.com/mirrors.txt focal main restricted universe multiverse" > /etc/apt/sources.list && \
    echo "deb mirror://mirrors.ubuntu.com/mirrors.txt focal-updates main restricted universe multiverse" >> /etc/apt/sources.list && \
    echo "deb mirror://mirrors.ubuntu.com/mirrors.txt focal-security main restricted universe multiverse" >> /etc/apt/sources.list
...

Cependant, l'installation du package lsb-release peut être très lente dans certaines régions.

La question est donc: existe-t-il un moyen approprié de définir le miroir source d'apt avant d'utiliser apt?


0 commentaires

3 Réponses :


3
votes

Le package lsb-release n'est pas inclus dans l'image minimale d'Ubuntu, mais vous pouvez utiliser le fichier /etc/lsb-release ou /etc/os-release la place (le second est couramment utilisé, reportez-vous à cette réponse pour comparaison ).

Pour Dockerfile, changez simplement $(lsb_release -cs) en $(. /etc/os-release && echo $VERSION_CODENAME) , vous ne perdrez pas de temps à mettre à jour et à installer les packages.


2 commentaires

Bonne suggestion! Mais quand je l'essaie dans la version docker, il en résulte source: not found . Mais cela pourrait être corrigé en utilisant .. /etc/os-release && echo $VERSION_CODENAME


mis à jour, Dockerfile RUN utilise /bin/sh par défaut au lieu de /bin/bash , source dans bash est un alias pour . , qui est disponible en bash et bourne shell.



0
votes

Utilisez simplement sed pour modifier les fichiers sources.list existants sur place. L'extrait de code suivant modifiera le fichier sources sur place sans tenir compte de la distribution exacte (et peut également fonctionner en toute sécurité sur d'autres distributions basées sur Debian, mais ne modifiera pas les fichiers).

Il modifie toutes les références à http://archive.ubuntu.com/ubuntu en mirror://mirrors.ubuntu.com/mirrors.txt (qui indique au client apt intégré d'utiliser automatiquement un miroir local lors de la récupération du réseau ) dans /etc/apt/sources.list

RUN sed -i -e 's/http:\/\/archive\.ubuntu\.com\/ubuntu\//mirror:\/\/mirrors\.ubuntu\.com\/mirrors\.txt/' /etc/apt/sources.list

Pour une utilisation dans un Dockerfile , simplement RUN cela - de préférence le plus tôt dans le Dockerfile possible que si:

sed -i -e 's/http:\/\/archive\.ubuntu\.com\/ubuntu\//mirror:\/\/mirrors\.ubuntu\.com\/mirrors\.txt/' /etc/apt/sources.list


1 commentaires

Veuillez expliquer davantage. D'autres personnes qui souhaitent utiliser vos solutions s'intéressent à lire des réponses claires.



0
votes

Dans le fichier docker, refléter le .. /etc/os-release && echo $VERSION_CODENAME pour la version lsb-release


0 commentaires