我想将curl
添加到Docker映像中,并且我正在Dockerfile中使用以下命令来这样做:
RUN apt-get update
RUN apt-get install curl ca-certificates -y
我的问题是,初始更新需要相当长的时间(2分钟)才能运行,所以在调试Dockerfile时,迭代速度很慢。特别是当我在RUN apt-get update
之前进行更改时,这会使Docker的图像缓存无效。
有什么办法可以使apt-get update
更具选择性,因此它仅更新到足以索引下载curl
的位置?还是其他我可以用来加快Docker构建速度的技术?
这是整个Dockerfile,
FROM postgres:9.6.10
ADD data/tsvs.tar.gz /standard_data
COPY postgres/*.sql /docker-entrypoint-initdb.d/
RUN apt-get update
RUN apt-get install curl ca-certificates -y
RUN curl https://www.postgresql.org/media/keys/ACCC4CF8.asc | apt-key add -
RUN apt-get install postgis postgresql-9.6-postgis-scripts -y
我目前正在对postgres / *。sql中的SQL文件进行更改,因此缓存无效。
答案 0 :(得分:1)
图像是按层组织的,每个层取决于后面的内容。图层也可以高速缓存。
再次运行构建时,请继续检查dockerfile中命令行的chcksum和是否已更改。如果没有,则将其从缓存中拉出。但是,如果这样做,它将重建以后的所有层。
在特定情况下,每次进行更改时,ADD命令都会生成一个新层,并触发所有后续层的重建。
在发现此问题之前,请先移动安装。
您还应该将所有安装都放在一行上,并在完成后清理apt缓存。
RUN apt-get install curl ca-certificates -y && \
curl https://www.postgresql.org/media/keys/ACCC4CF8.asc | apt-key add - && \
apt-get install postgis postgresql-9.6-postgis-scripts -y && \
rm -rf /var/cache/apt && \
apt-get clean
答案 1 :(得分:0)
如果将 int currentScore;
final int earnedScore;
@override
Widget build(BuildContext context) {
updateScore();
setScore();
return....
}
Future<int> getScore() async {
SharedPreferences prefs = await SharedPreferences.getInstance();
return prefs.getInt(widget.keyNameScore);
}
Future<void> saveScore(int score) async{
SharedPreferences prefs = await SharedPreferences.getInstance();
prefs.setInt(widget.keyNameScore, score);
}
void updateScore() async{
getScore().then((value){
currentScore = value;
currentScore = currentScore + earnedScore;
saveScore(currentScore);
});
}
void setScore(){
getScore().then((value){
setState(() {
currentScore = value;
});
});
}
安装内容移到我要更改的部分之前,则缓存命中率会更高。我的新文件是
curl
h / t致Caleb H.的评论中考虑了这一点。
答案 2 :(得分:0)
This post on reddit 建议使用 sources.list
将本地 apt COPY sources.list /etc/apt/
复制到容器可能有助于容器的 apt update
使用本地镜像,这可能会加快速度