- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在使用 CircleCI 和 docker 进行 CI/CD 管道。基本上,每次将新代码推送到 GitHub 时,我都会将 (python) 应用程序和环境包装在新的 docker 镜像中。然后,我将镜像推送到由 Nexus 托管的私有(private) Docker 注册表,并通过从该注册表中提取最新镜像并运行容器来部署我的应用程序。
我的问题是这些 docker 镜像占用了大量空间:
REPOSITORY TAG IMAGE ID CREATED SIZE
my-app 0.1.23 6f13476770c2 3 minutes ago 1.99GB
my-app 0.1.22 7ff62dddb50a 10 minutes ago 1.99GB
my-app 0.1.21 55af2d3235c7 3 hours ago 1.99GB
my-app 0.1.20 304543b7fc71 5 hours ago 1.99GB
my-app 0.1.17 fddcef3f262b 2 weeks ago 1.99GB
my-app 0.1.16 a62c9ba1f997 2 weeks ago 1.99GB
my-app 0.1.12 a8d87d86699a 2 weeks ago 1.99GB
由于运行环境在镜像中占用了大量空间,并且它不会频繁更改(不像更改代码那么频繁),因此我认为一遍又一遍地构建相同的依赖项/环境会浪费大量空间。所以问题是我的做法正确吗?如果不是,最佳实践是什么。提前致谢!
附注我使用的环境需要一些依赖项(numpy、tensorflow等),这些依赖项需要GCC,因此如果我没有记错的话,我不能不使用python alpine图像。
我的 Dockerfile:
FROM python:3.6-stretch
# Install app dependencies
RUN apt-get update && apt-get install -y \
python3-dev \
python3-pip
RUN mkdir /opt/working_dir/
WORKDIR /opt/working_dir/
# Copy the entire project into the current directory
COPY . ./
RUN pip install --upgrade pip
RUN pip install -r requirements.txt
一些 docker 镜像历史记录:
$ docker image history my-app:0.1.23
6f13476770c2 19 hours ago /bin/sh -c pip install -r requirements.txt 955MB
<missing> 19 hours ago /bin/sh -c pip install --upgrade pip 4.97MB
<missing> 19 hours ago /bin/sh -c #(nop) COPY dir:5bb6533618d16964c… 16.5MB
<missing> 19 hours ago /bin/sh -c #(nop) WORKDIR /opt/reco_engine/ 0B
<missing> 19 hours ago /bin/sh -c mkdir /opt/reco_engine/ 0B
<missing> 19 hours ago /bin/sh -c apt-get update && apt-get install… 90.6MB
<missing> 6 days ago /bin/sh -c #(nop) CMD ["python3"] 0B
<missing> 6 days ago /bin/sh -c set -ex; wget -O get-pip.py 'ht… 6.04MB
<missing> 6 days ago /bin/sh -c #(nop) ENV PYTHON_PIP_VERSION=19… 0B
<missing> 6 days ago /bin/sh -c cd /usr/local/bin && ln -s idle3… 32B
<missing> 6 days ago /bin/sh -c set -ex && wget -O python.tar.x… 65.3MB
<missing> 6 days ago /bin/sh -c #(nop) ENV PYTHON_VERSION=3.6.8 0B
<missing> 6 days ago /bin/sh -c #(nop) ENV GPG_KEY=0D96DF4D4110E… 0B
<missing> 6 days ago /bin/sh -c apt-get update && apt-get install… 16.9MB
<missing> 6 days ago /bin/sh -c #(nop) ENV LANG=C.UTF-8 0B
<missing> 6 days ago /bin/sh -c #(nop) ENV PATH=/usr/local/bin:/… 0B
<missing> 6 days ago /bin/sh -c set -ex; apt-get update; apt-ge… 562MB
<missing> 6 days ago /bin/sh -c apt-get update && apt-get install… 142MB
<missing> 6 days ago /bin/sh -c set -ex; if ! command -v gpg > /… 7.81MB
<missing> 6 days ago /bin/sh -c apt-get update && apt-get install… 23.2MB
<missing> 6 days ago /bin/sh -c #(nop) CMD ["bash"] 0B
<missing> 6 days ago /bin/sh -c #(nop) ADD file:843b8a2a9df1a0730… 101MB
$ docker image history my-app:0.1.22
IMAGE CREATED CREATED BY SIZE COMMENT
7ff62dddb50a 19 hours ago /bin/sh -c pip install -r requirements.txt 955MB
<missing> 19 hours ago /bin/sh -c pip install --upgrade pip 4.97MB
<missing> 19 hours ago /bin/sh -c #(nop) COPY dir:f054e43f5766a4738… 16.5MB
<missing> 19 hours ago /bin/sh -c #(nop) WORKDIR /opt/reco_engine/ 0B
<missing> 19 hours ago /bin/sh -c mkdir /opt/reco_engine/ 0B
<missing> 19 hours ago /bin/sh -c apt-get update && apt-get install… 90.6MB
<missing> 6 days ago /bin/sh -c #(nop) CMD ["python3"] 0B
<missing> 6 days ago /bin/sh -c set -ex; wget -O get-pip.py 'ht… 6.04MB
<missing> 6 days ago /bin/sh -c #(nop) ENV PYTHON_PIP_VERSION=19… 0B
<missing> 6 days ago /bin/sh -c cd /usr/local/bin && ln -s idle3… 32B
<missing> 6 days ago /bin/sh -c set -ex && wget -O python.tar.x… 65.3MB
<missing> 6 days ago /bin/sh -c #(nop) ENV PYTHON_VERSION=3.6.8 0B
<missing> 6 days ago /bin/sh -c #(nop) ENV GPG_KEY=0D96DF4D4110E… 0B
<missing> 6 days ago /bin/sh -c apt-get update && apt-get install… 16.9MB
<missing> 6 days ago /bin/sh -c #(nop) ENV LANG=C.UTF-8 0B
<missing> 6 days ago /bin/sh -c #(nop) ENV PATH=/usr/local/bin:/… 0B
<missing> 6 days ago /bin/sh -c set -ex; apt-get update; apt-ge… 562MB
<missing> 6 days ago /bin/sh -c apt-get update && apt-get install… 142MB
<missing> 6 days ago /bin/sh -c set -ex; if ! command -v gpg > /… 7.81MB
<missing> 6 days ago /bin/sh -c apt-get update && apt-get install… 23.2MB
<missing> 6 days ago /bin/sh -c #(nop) CMD ["bash"] 0B
<missing> 6 days ago /bin/sh -c #(nop) ADD file:843b8a2a9df1a0730… 101MB
最佳答案
app-base
。app-base
图像绝对要尽可能小。它不包括虚拟机所做的事情。您从一个小的基础镜像开始,然后不断地工作,使其变得非常小。app-base
。您的应用大小取决于您的应用程序大小,但您不应该提供开发工具。我假设你运行 python。例如,您的图像是 2GB。 Alpine Linux Python docker 镜像大小为 80MB。您的应用程序可能会再添加 100MB。如果您有许多 native 依赖项,那么可能很难分解它或使用 Alpine(假设您需要 GCC)。
如果一切顺利,您的应用程序基础镜像将是 80MB,而您要部署的 CI 构建的应用程序镜像将是 100MB。这 80MB 不会被一遍又一遍地占用,因为您的 Nexus 服务器将重用其中包含 Python 的 app-base
(来自 Alpine Python 或您自己的自定义)。采用这种方法可能会节省大量空间(这意味着速度)。
但这取决于您的应用及其遗留程度。
“最佳”实践(没有这样的东西,但这里有一些提示):
关于docker - 使用 docker 进行 CI/CD 时节省空间的最佳实践是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55463607/
我试图找出在将数据传输到设备之前将数据复制到固定内存是否有意义,因为我对输入数据的分配没有影响(它是一个库)。 std::vector idata(WORK_SIZE); int *idata_ali
model.save() 让我很困惑。 示例。我将我的 mongoose.model(mongoose.schema) 移动到单独的 model.js 文件中。当我使用这种方法创建模型时,以下问题困扰
我正在用 Java Swing 制作模拟时钟。要计算我需要的时钟指针角度: 我可以通过 System.currentTimeMillis() 获得的以毫秒为单位的 UTC 时间 时区偏移 TimeZo
编辑 我的应用程序中有声音,该声音在应用程序启动时开始播放。此外,我还有两种播放和停止声音的方法: -(void)playBgMusic { NSString *path = [[NSBundle m
所以我的应用有 1 个 Activity 和 4 个 fragment ,其中一个有 Chronometer 来显示经过了多少时间。 它工作正常,但我有一个问题,每次我移动到另一个 fragment
我是 FireDAC 新手,遇到问题。我想在Delphi XE7中使用FireDAC读写SQLite数据库。我尝试的大部分方法都有效,但我在将 TTime 保存到 SQLite DB 时遇到问题。 这
这是我使用基本 Node.js 服务器创建的示例站点。我能够成功发布、创建给定架构的用户,然后“保存”到数据库;但是,保存不会返回用户对象,并且在我的实际数据库中找不到。连接也返回成功。 main.j
我有一台配备 2 Gb Nvidia GPU 的 Mac Book Pro。我正在尝试利用我所有的 GPU 内存进行计算(python 代码)。如果我绕过 GUI 界面并仅通过命令行访问我的机器,我可
我希望使用 Powerpoint 创建一种测验,我想保存用户提供的输入。 例如:如果我问这个问题:你最喜欢什么颜色?当他们回答问题并单击下一步按钮时,我想保存文本框的值并将其附加到输出文件中。 我已经
我是一名优秀的程序员,十分优秀!