我读到 Docker 是通过层来工作的,因此在使用 Dockerfile
创建 container
时,从基础镜像开始,后续命令将向容器添加一层,因此如果您保存了该新容器的状态,则会得到一个新镜像。这里有几个问题我想知道。
如果我从一个相当大而笨重的Ubuntu映像开始,因为它是完整的操作系统,然后我添加了一些工具并将其保存为一个新映像,然后上传到hub上。如果有人下载我的镜像,并且他们已经在他们的images folder
中保存了一个Ubuntu映像,这是否意味着他们可以跳过下载Ubuntu,因为他们已经有了镜像?如果是这样的话,当我修改原始镜像的某些部分时,它是如何工作的?Docker是否使用其缓存数据选择性地将这些更改应用于之前加载的Ubuntu镜像?
2.) 如何通过修改Dockerfile来更新我构建的映像?我使用以下Dockerfile
设置了一个简单的django项目:
FROM python:3.5
ENV PYTHONBUFFERED 1
ENV APPLICATION_ROOT /app
ENV APP_ENVIRONMENT L
RUN mkdir -p $APPLICATION_ROOT
WORKDIR $APPLICATION_ROOT
ADD requirements.txt $APPLICATION_ROOT
RUN pip install --upgrade pip
RUN pip install -r requirements.txt
ADD . $APPLICATION_ROOT
然后使用它来创建开头的图像。所以每次我创建一个盒子,它都会加载所有这些 环境变量
,如果我完全重建盒子,则重新安装软件包和所有其他内容。我需要添加一个新的环境变量,所以我将其添加到 Dockerfile
的底部,以及一个测试变量:
ENV COMPOSE_CONVERT_WINDOWS_PATHS 1
ENV TEST_ENV_VAR TEST
当我删除容器和镜像,并构建一个新的容器时,一切似乎都按计划进行,它告诉我它创建了新的第四步:ENV。
COMPOSE_CONVERT_WINDOWS_PATHS 1
---> Running in 75551ea311b2
---> b25b60e29f18
Removing intermediate container 75551ea311b2
就像在一些中间容器转换中有东西丢失了一样。这就是缓存系统的工作方式吗,每一个新层都是一个“中间容器”?那么考虑到这一点,如何添加新层,您是否总是需要在 Dockerfile 的底部添加新数据?还是在构建完镜像后最好保持 Dockerfile 不变,只修改“容器”并构建一个新镜像?
编辑 我刚试图安装一个叫做bwawrik/bioinformatics
的包,它是一个基于CentOS的容器,里面安装了很多工具。
它在一半的时候冻结了,所以我退出了它,然后再次运行它,看看是否安装了所有内容:
$ docker pull bwawrik/bioinformatics
Using default tag: latest
latest: Pulling from bwawrik/bioinformatics
a3ed95caeb02: Already exists
a3ed95caeb02: Already exists
7e78dbe53fdd: Already exists
ebcc98113eaa: Already exists
598d3c8fd678: Already exists
12520d1e1960: Already exists
9b4912d2bc7b: Already exists
c64f941884ae: Already exists
24371a4298bf: Already exists
993de48846f3: Already exists
2231b3c00b9e: Already exists
2d67c793630d: Already exists
d43673e70e8e: Already exists
fe4f50dda611: Already exists
33300f752b24: Already exists
b4eec31201d8: Already exists
f34092f697e8: Already exists
e49521d8fb4f: Already exists
8349c93680fe: Already exists
929d44a7a5a1: Already exists
09a30957f0fb: Already exists
4611e742e0b5: Already exists
25aacf0148db: Already exists
74da82504b6c: Already exists
3e0aac083b86: Already exists
f52c7e0ac000: Already exists
35eee92aaf2f: Already exists
5f6d8eb70885: Already exists
536920bfe266: Already exists
98638e678c51: Already exists
9123956b991d: Already exists
1c4c8a29cd65: Already exists
1804bf352a97: Already exists
aa6fe9359956: Already exists
e7e38d1250a9: Already exists
05e935c831dc: Already exists
b7dfc22c26f3: Already exists
1514d4797ffd: Already exists
Digest: sha256:0391808e21b7b5cc0eb44fc2dad0d7f5415115bdaafb4534c0b6a12efd47a88b
Status: Image is up to date for bwawrik/bioinformatics:latest
所以它肯定是分段安装软件包的,而不是一次性全部安装。这些分段是不同的镜像吗?
docker pull <image>
。 - MakisH