Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/docker/10.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_Kubernetes_Command Line Interface - Fatal编程技术网

Docker 为您的容器化应用程序提供自定义命令行工具的最佳实践是什么?

Docker 为您的容器化应用程序提供自定义命令行工具的最佳实践是什么?,docker,kubernetes,command-line-interface,Docker,Kubernetes,Command Line Interface,我们是一家软件供应商,目前正在调查Docker,特别是Kubernetes,以便让客户在其环境中安装我们的软件堆栈。 我们的软件附带了一整套命令行工具,主要用于管理目的。虽然大多数管理任务可以通过UI完成,但其他任务只能通过这些工具完成。 我们想办法向在Docker上运行我们软件的客户提供这些工具。第一个想法是为他们提供一个大的存档,他们可以下载并在他们的管理机器上运行。 但是我们很快想到了一个主意,提供一个包含所有这些工具的“管理工具”容器。与我们的其他容器不同,这个容器不是作为服务器运行的,

我们是一家软件供应商,目前正在调查Docker,特别是Kubernetes,以便让客户在其环境中安装我们的软件堆栈。 我们的软件附带了一整套命令行工具,主要用于管理目的。虽然大多数管理任务可以通过UI完成,但其他任务只能通过这些工具完成。 我们想办法向在Docker上运行我们软件的客户提供这些工具。第一个想法是为他们提供一个大的存档,他们可以下载并在他们的管理机器上运行。 但是我们很快想到了一个主意,提供一个包含所有这些工具的“管理工具”容器。与我们的其他容器不同,这个容器不是作为服务器运行的,而是通过脚本或交互方式运行的。 尽管相应的docker或kubectl命令行有点长,但这基本上是可行的,我认为这种方法有相当多的优点,因为它是一种“带内”方式,也可以发布我们的命令行工具。 但是,某些管理任务要求您将文件传递到相应的命令行工具或工具生成文件(例如备份)。因此,您需要一种将这些文件放入或移出容器的方法。 在Docker环境中,使用“Docker run”并将卷或主机目录装载到包含文件的容器中非常简单。 不过,在Kubernetes中,这似乎并不是那么简单(请参阅“kubectl run”……Yikes!)的实现方法。 在常规pod(使用YAML文件创建)中运行admin tools容器并装载卷并附加到它实际上更简单

最后,我想听听您对标题问题的看法:让用户可以使用用于管理容器化应用程序的命令行工具的“最佳”方法是什么

  • 将它们作为专用归档提供,并让用户像在容器之前的世界一样使用它们
  • 将它们装在要交互使用的容器中(如上所述)
  • 还有其他想法吗
问候
PJ

以下选项应可供用户使用:

  • 这些工具应该是带有标签的docker图像
  • 用户应该可以自由地使用docker图像,或者根据对他们有用的内容使用docker run或kubernetes(留给用户)
  • 这些工具也应该作为tar档案在pre-docker世界中提供,因为并非所有用户都希望使用docker
  • 这些工具也可以在云上提供/托管,用户可以在云上运行它们。参见
    https://cmd.io/

您需要Kubernetes操作符

人们不想使用您的CLI,他们只是使用您的CLI来“完成工作”。如果可以将CLI操作放入Kubernetes操作符中,则可以获得任何其他工具都可以使用的标准API


例如,假设我们的软件有点像数据库。您的操作员可以有一个代表每个数据库的条目,其中包含“备份频率”和“副本数量”字段。任何工具(甚至是
kubctl
CLI)都可以设置这些字段,而您的操作员会完成所有的繁琐工作。您的客户只安装一个运营商,他们不必管理“完成工作”的临时容器,也不必了解您的CLI。

我和下一位软件工程师一样喜欢命令行工具;我的观点是Docker不应该成为你解决方案的一部分

作为一个工具使用者,我非常清楚两个重要的细节:我需要根等价的特权才能在Docker中运行某些东西,而且Docker容器与我的主应用程序有单独的文件系统空间。以Docker本身为例,很高兴知道我可以

docker images | grep dmaze | awk '{ print $1 ":" $2 }' | xargs docker rmi
但是,如果我用扩展的
docker run-e替换
docker
,这就变得更加困难了-v-v供应商/imagename命令
调用

类似地,浏览Stack Overflow(堆栈溢出)也是值得的,因为有这样的问题:

我已经用Docker打包了我的工具。我正在试着运行它。我需要什么
docker run-v
选项才能让它访问我的文件?它不作为根运行;我需要什么权限设置?如果有一个文件引用另一个文件,如何使文件名在不同环境中保持一致?我忘了运行docker-v,我的输出文件现在完全消失了吗

如果你的工具被打包成一个Docker镜像,那么你就把所有这些复杂的事情都推给了用户;只需在
$PATH
中放置一些东西,对我来说使用起来就简单多了

作为工具供应商,您的优势似乎非常小。Docker图像是单个工件,但tar文件也是。您可以依赖一组通用的base C库和语言运行时,这些库和语言运行时随时可用;例如,您可以使用标准Python库完成很多工作,并且几乎每一个Linux安装都可以使用它

Kubernetes在这里绝对不适用。它对于在集群环境中运行分布式应用程序非常有用。一些非常专注的开发人员可能有
minikube
可用,但这并不是每天都要做的事情,在Kubernetes吊舱中获得一个交互式shell甚至比在Docker容器中获得一个更为例外