在构build之间caching下载资源的最佳实践
我正在构build一个我想要作为Docker容器部署的Web应用程序。 应用程序依赖于存储在单独的Git存储库中的一组资产。 使用单独存储库的原因是该存储库的历史logging比当前结帐要大得多,我们希望有一种方法可以在不触及包含源代码的存储库的历史logging的情况下丢弃历史logging。
在下面的示例中,仅包含相关的部分,我将使用文件将资产存储库提交ID传递到构build过程中:
FROM something:something # [install Git and stuff] COPY ["assets_git_id", "/root/"] RUN git clone --bare git://lala/assets.git /root/assets.git \ && mkdir -p /srv/app/assets && git --git-dir=/root/assets.git --work-tree=/srv/app/assets checkout $(</root/assets_git_id) . && rm -r /root/assets.git # [set up the rest of the application]
这里的问题是,只要该ID发生变化,整个存储库就会在构build过程中被克隆,大部分数据将被丢弃。
在这种情况下,什么是规范的方式来减less浪费的资源? 理想情况下,我希望在构build期间从容器内访问目录,其内容保持在同一构build的多个运行之间。 然后RUN
脚本可以更新存储库并从中复制相关数据,而不是每次克隆整个存储库。
使用多阶段构build
# Stage 1 FROM something:something as GitSource # [install Git] RUN git clone --bare git://lala/assets.git /root/assets.git COPY ["assets_git_id", "/root/"] RUN git --git-dir=/root/assets.git pull RUN mkdir -p /srv/app/assets RUN git --git-dir=/root/assets.git --work-tree=/srv/app/assets checkout $(</root/assets_git_id) . # Stage 2 FROM something:something COPY --from=GitSource /srv/app/assets /srb/app/assets # [set up the rest of the application]
对于最终图像,除了正在复制到第2阶段的内容之外,它将放弃在第1阶段中执行的任何操作。
- Dockered Django + Celery(`celeryd`和`celerybeat`),任务被执行,但数据库(SQLite)不被修改。 哪里不对?
- Docker – 全部火花笔记本 – 从本地卷运行 – Ubuntu的
- 如何清除docker容器内的caching内存
- Dockernetworking:自动发现网桥中的主机名
- 使用Django和Postgresql的多租户平台的解决scheme
- 如何在RHEL 7.2上安装Docker CE,因为我们正在做一个poc,我们不想为EE付费
- stub.GetHistoryKeys()报告GetHistoryKeys()函数未定义。 当试图去build立我的Chaincode
- 如何绑定VM docker-machine创build的OSX IP地址?
- 连接到远程进程时,不会在VS Codedebugging模式下触发的断点
- Docker撰写卡住下载或拉动FS层
- 外部F5负载均衡器与Docker群集服务发现的集成