Docker ADD vs 体积

我正在学习多克和我有疑问的时间和地点使用 ADDVOLUME。以下是我认为这两者的作用:

ADD

在构建时将文件复制到映像。映像包含所有文件,因此您可以非常容易地进行部署。另一方面,在开发中,每次都需要构建看起来并不是一个好主意,因为构建需要开发人员运行命令来重新构建容器; 此外,构建容器可能非常耗时。

音量

我知道使用 docker run -v你可以在你的容器中挂载一个主机文件夹,这样你可以很容易的修改文件,并且观察你的容器中的应用程序对变化的反应。它在开发中看起来很棒,但是我不确定如何以这种方式部署我的文件。

70999 次浏览

VOLUME指令在运行时在 Docker 容器中创建一个数据卷。作为 VOLUME参数提供的目录是一个绕过 联合文件系统的目录,主要用于持久化和共享数据。

如果运行 docker inspect <your-container>,您将在 Mounts部分下看到一个 Source表示主机上的目录位置,一个 Destination表示容器中挂载的目录位置。比如说,

"Mounts": [
{
"Name": "fac362...80535",
"Source": "/var/lib/docker/volumes/fac362...80535/_data",
"Destination": "/webapp",
"Driver": "local",
"Mode": "",
"RW": true,
"Propagation": ""
}
]

以下是 docker run -v的3个用例:

  1. docker run -v /data: 这类似于在 Dockerfile 中指定 VOLUME指令。
  2. docker run -v $host_path:$container_path: 这允许您在运行时将 $host_path从主机挂载到容器中的 $container_path。在开发中,这对于在主机上与容器共享源代码非常有用。在生产中,这可以用来将主机的 DNS 信息(在 /etc/resolv.conf中找到)或机密挂载到容器中。相反,您也可以使用此技术将容器的日志写入主机上的特定文件夹中。$host_path$container_path都必须是绝对路径。
  3. docker run -v my_volume:$container_path: 这将在 $container_path处的容器中创建一个数据卷,并将其命名为 my_volume。它本质上与使用 docker volume create my_volume创建和命名卷相同。这样命名卷对于使用多主机存储驱动程序(如 弗洛克)的 集装箱数据量集装箱数据量和共享存储卷非常有用。

请注意,将主机文件夹挂载为数据卷的方法在 Dockerfile 是不可用的。引用 码头文件的话,

注意: 由于 Dockerfile 具有可移植性和共享性,所以它不能从 Dockerfile 中获得。由于主机目录本质上依赖于主机,Dockerfile 中指定的主机目录可能无法在所有主机上工作。

现在,如果希望将文件复制到非开发环境中的容器中,可以在 Dockerfile 中使用 ADDCOPY指令。这些是我通常用于非开发部署的内容。

ADD

这两者之间的根本区别在于,ADD使您添加的任何东西,无论是一个文件夹还是实际上只是一个文件 你形象的一部分。任何使用您之后构建的映像的人都可以访问您的 ADD。这是真实的,即使你之后删除它,因为多克工作在图层和 ADD层仍然存在作为图像的一部分。需要说明的是,您只能在构建时使用 ADD,而不能在运行时使用 ADD

下面是一些你想要使用 ADD的例子:

  • 您希望在 Dockerfile 中引用和安装一个 requments.txt 文件中的一些需求。然后你可以做: ADD ./requirements.txt /requirements.txt后面跟着 RUN pip install -r /requirements.txt
  • 例如,如果你想把你的应用程序代码作为 Dockerfile 的上下文,如果你想把你的应用程序目录设置为你图片中的工作目录,并且让一个容器中的默认命令从你的图片中运行实际上运行你的应用程序,你可以这样做:

    ADD ./ /usr/local/git/my_app

    WORKDIR /usr/local/git/my_app

    CMD python ./main.py

音量

卷,另一方面,只允许从映像运行的容器访问运行容器的本地机器上的某个路径。你 不能使用 Dockerfile 中 VOLUME目录中的文件。卷目录中的任何内容都将 在构建时无法访问,但 将在运行时可访问除外。

下面是一些你想要使用 VOLUME的例子:

  • 在容器中运行的应用程序在 /var/log/my_app中创建日志。您希望在主机上可以访问这些日志,并且在删除容器时不要删除这些日志。通过将 VOLUME /var/log/my_app添加到 Dockerfile 中,然后使用 docker run -v /host/log/dir/my_app:/var/log/my_app some_repo/some_image:some_tag运行容器,可以在 /var/log/my_app上创建一个挂载点
  • 您有一些本地设置文件,您希望在容器中的应用程序可以访问。也许这些设置文件在您的本地机器上与开发人员和生产环境上是不同的。特别是如果这些设置文件是秘密的,在这种情况下,您 绝对不希望他们在你的形象。在这种情况下,一个好的策略是将 VOLUME /etc/settings/my_app_settings添加到 Dockerfile 中,使用 docker run -v /host/settings/dir:/etc/settings/my_app_settings some_repo/some_image:some_tag运行容器,并确保/host/sets/dir 存在于您希望应用程序运行的所有环境中。