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?
3 Réponses :
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.
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.
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
Veuillez expliquer davantage. D'autres personnes qui souhaitent utiliser vos solutions s'intéressent à lire des réponses claires.
Dans le fichier docker, refléter le .. /etc/os-release && echo $VERSION_CODENAME
pour la version lsb-release