Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/spring-mvc/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何更新docker图像?_Docker_Docker Compose - Fatal编程技术网

如何更新docker图像?

如何更新docker图像?,docker,docker-compose,Docker,Docker Compose,我了解到docker使用层,因此当使用Dockerfile创建容器时,您从基本图像开始,然后运行后续命令向容器添加层,因此如果您保存新容器的状态,您将有一个新图像。关于这件事,有几件事我很好奇 如果我从一个Ubuntu图像开始,这是一个非常大的图像,因为它是一个完整的操作系统,那么我会在其中添加一些工具,并将其保存为一个新图像,然后上传到hub。如果有人下载了我的图片,并且他们的图片文件夹中已经保存了Ubuntu图片,这是否意味着他们可以跳过下载Ubuntu,因为他们已经有了图片?如果是这样的话

我了解到docker使用层,因此当使用
Dockerfile
创建
容器时,您从基本图像开始,然后运行后续命令向容器添加层,因此如果您保存新容器的状态,您将有一个新图像。关于这件事,有几件事我很好奇

如果我从一个
Ubuntu
图像开始,这是一个非常大的图像,因为它是一个完整的操作系统,那么我会在其中添加一些工具,并将其保存为一个新图像,然后上传到hub。如果有人下载了我的图片,并且他们的
图片文件夹中已经保存了Ubuntu图片,这是否意味着他们可以跳过下载
Ubuntu
,因为他们已经有了图片?如果是这样的话,当我修改原始图像的部分内容时,Docker是如何工作的?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
当我删除容器和图像,并构建一个新的容器时,一切似乎都相应地进行了,它告诉我它创建了新的步骤4: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
因此,它肯定是分块安装的,而不是一次性安装的。这些是不同的图像吗?

图像与容器 首先,让我澄清一些术语

图像:一个静态的、不可变的对象。这是您在使用
Dockerfile
运行
docker build
时构建的内容。图像不是运行的东西

图像由层组成。图像可能只有一层,也可能有许多层

容器:运行的东西。它使用图像作为起始模板

这类似于二进制程序和进程。磁盘上有一个二进制程序(如
/bin/sh
),运行它时,它是系统上的一个进程。这类似于图像和容器之间的关系

向基础图像添加层 您可以从基本映像(例如示例中的
ubuntu
)构建自己的映像。
Dockerfile
中的某些命令将在最终图像中创建一个新层。其中一些是
RUN
COPY
ADD

第一层没有父层。但每一层都有一个父层。通过这种方式,它们彼此相连,像煎饼一样堆积起来

每个层都有一个唯一的ID(您已经看到的长十六进制散列)。它们也可以有人类友好的名字,称为标签(例如
ubuntu:16.04

什么是图层与图像? 从技术上讲,每一层也是一个图像。如果您构建了一个新图像,并且它有5个层,那么您可以使用该图像,并且它将包含所有5个层。如果使用堆栈中的第三层作为图像ID运行容器,也可以这样做,但它只包含3层。您指定的一个和它的两个祖先

但按照惯例,术语“图像”通常指具有相关标签的层。当您运行
docker images
时,它将显示所有顶级图像,并隐藏下面的层(但您可以使用
-a
显示所有层)

什么是中间容器? 当
docker build
运行时,它会在容器内完成所有工作(当然!),因此如果遇到
RUN
步骤,它会从当前顶层创建一个容器,在其中运行指定的命令,然后将结果保存为新层。然后它将从这个新层创建一个容器,运行下一步。。。等等

中间容器仅用于构建过程,并在构建之后丢弃

层文件系统如何工作 您询问下载基于
ubuntu
的图像的人是否只进行了部分下载,如果他们已经在本地下载了
ubuntu
图像

对!!完全正确

每一层都使用它下面的层作为基础。新层基本上是该层和新状态之间的差异。不过,这与git提交的工作方式不同。它在文件级别工作,而不是在行级别

假设您是从ubuntu开始的,并且您运行了这个Dockerfile

FROM:ubuntu:16.04
运行groupadd dan&&useradd-g dan
这将产生两层图像。第一层是
ubuntu
图像。第二种可能只有很少的变化

  • 用户为“dan”的较新版本的
    /etc/passwd
  • 带有组“dan”的较新的
    /etc/group
  • 新目录
    /home/dan
  • 两个默认文件,如
    /home/dan/.b