使用卷代码是否是docker最佳实践?

VOLUME指令应该被用来显示你的docker容器创build的任何数据库存储区域,configuration存储或者文件/文件夹。 强烈build议您将VOLUME用于图像的任何可变和/或用户可用部分。

你会存储你的代码量?

比如你的jar文件。 在不重build图像的情况下部署应用程序可能会稍微方便一些。
如果将代码存储在卷中,是否有任何考虑? 如性能,安全性或其他。

我不推荐在Dockerfile中使用VOLUME语句来处理当前版本的docker(当前是引入命名卷之后的任何版本的docker)。 包括VOLUME命令有多个缺点,包括:

  • 可能无法更改图像位置的任何后续步骤或子图像的内容(此行为似乎是不同的scheme和不同版本的docker)
  • 潜在的创build卷,只是散列的名称docker volume ls输出,很难find和稍后重用,如果你需要在里面的数据
  • 如果将代码放在一个卷中,并从新版本的映像中重新创build容器,那么卷将仍然具有代码的旧副本,除非您自己更新该卷(卷的主要function是持久性数据你不想在迭代之间保持)

我build议把你的数据放在你在docker docker run命令行或docker-compose.yml中定义的卷上。 在那里定义的卷可以有一个名字或映射回到docker主机上的path。 你可以制作任何文件夹或文件卷,而不需要在Dockerfile中定义它。 此步骤定义的卷不会影响图像,使您可以扩展图像而不会被locking,无法更改目录。

对于您的代码,如果在应用程序开发过程中解释(例如,javascript)或已编译(例如,jar文件),那么注入带有卷的代码是一种常见的最佳做法。 您可以在容器(不是Dockerfile)上定义卷,并使用相同的文件名覆盖也复制到映像中的代码或二进制文件。 这使您可以快速迭代开发,而无需频繁重build图像。 取决于应用程序,您可能能够重新加载代码,否则,应该只需要重新启动容器即可查看最新的更改。 一旦开发完成,您可以使用当前代码重新构build映像,并将其发送给可以使用该映像的人员,而无需为代码安装卷。

如果您想了解更多关于这方面的细节,我也会在Dockerfiles内部的博客上发表博文 。

你说:

在不重build图像的情况下部署应用程序可能会稍微方便一些。

取而代之的是,在应用程序版本中封装图像版本有很多好处。 您只需部署映像即可轻松部署您的应用程序,因此,您将卷用于应用程序代码的事实会导致您编排一些其他部署方法来更新该卷。

而且你必须(最终)将jar版本与正确的图像版本进行匹配。

关于安全或performance,我不认为有特别的考虑。

无论如何,这不是一个常用的方法来使用卷。 正如@BMitch所说,在Dockerfile中使用VOLUME是一件棘手的事情。