我在 docker 中使用了 python 映像,并添加了一些依赖项,如下所示:
RUN apt-get update -y
&& apt-get install -y apt-utils libsasl2-dev python3-dev libldap2-dev libssl-dev libsnmp-dev snmp-mibs-downloader
我收到错误
E: Package 'snmp-mibs-downloader' has no installation candidate
搜索后是因为我需要按照以下方式添加非自由存储库:http://installion.co.uk/debian/wheezy/non-free/s/snmp-mibs-downloader/install/index.html
我相信我需要编辑/etc/apt/sources.list 并添加以下内容:
deb http://http.us.debian.org/debian jessie main contrib non-free
deb http://security.debian.org jessie/updates main contrib non-free
但是我如何通过 docker 文件做到这一点?
虽然这是正确的命令,
sed -i -e's/ main/ main contrib non-free/g' /etc/apt/sources.list
如果要执行此操作,则应将其作为第一张图像其余部分的一部分,
RUN
sed -i -e's/ main/ main contrib non-free/g' /etc/apt/sources.list
&& apt-get -q update
&& apt-get -qy dist-upgrade
&& apt-get install -qy foobar
&& foobar whatever
&& apt-get -qy --purge remove foobar
&& apt-get clean
&& rm -rf /var/lib/apt/lists
上面显示了此命令与其余apt
内容的完整流程。
与将non-free
组件添加到sources.list
的方式相同。编辑 Dockerfile 中的/etc/apt/sources.list
文件并替换如下所示的行:
deb http://http.us.debian.org/debian jessie main contrib
由
deb http://http.us.debian.org/debian jessie main contrib non-free
您可以在 Dockerfile 中使用类似命令执行此操作
sed -i "s#deb http://http.us.debian.org/debian jessie main contrib non-free#deb http://http.us.debian.org/debian jessie main contrib non-free#g" /etc/apt/sources.list
security.debian.org
也是如此.
您可以使用其他答案提供的任何脚本。 我刚刚用sed做了一些测试。 这个sed对我有用:
sudo sed -i -e "s/ main[[:space:]]*$/ main contrib non-free/" /etc/apt/sources.list
基本上它匹配"main",空格和行尾。 这基本上意味着 main 是该行中的最后一个回购。 如果匹配,则在末尾添加 contrib 和 non-free。 如果要对其进行测试,请删除 -i 以就地编辑。
这个sed的好处是它在重复使用时不会重复存储库。 因此,没有机会有重复的存储库。