gpt4 book ai didi

scala - Elastic BeanStalk Docker应用程序,写入本地文件

转载 作者:行者123 更新时间:2023-12-02 19:38:59 24 4
gpt4 key购买 nike

我有一个play scala应用程序,正在通过AWS Elasticbeanstalk控制台将其部署为通用docker应用程序。在本地运行应用程序时,我看不到任何问题,因此我认为代码是正确的。
我需要有能力

  • 将文件写入本地磁盘
  • 在这些文件上运行一些命令行实用程序(例如ffmpeg)

  • 但是,我的应用程序不写入本地磁盘,也不让我执行命令行实用程序。
     val localFile = new File(s"$localFilePath/$siteId/download/${fileName}.raw")
    s3Client.getObject(new GetObjectRequest(bucketName, summary.getKey), localFile)
    val cmd = s"ffmpeg -i ${localFile.getAbsolutePath} -vcodec copy ${localFile.getAbsolutePath}.mp4"
    cmd !;

    这是我的Dockerrun.aws.json文件
    {"AWSEBDockerrunVersion": "1","Logging": "/opt/docker/logs"}

    更新
    更新了我的Dockerrun.aws.json文件以包含卷映射
    {"AWSEBDockerrunVersion": "1","Logging": "/opt/docker/logs","Volumes":[{"HostDirectory": "/tmp/files","ContainerDirectory": "/tmp/files"}]}

    该应用程序现在正在写入本地文件,但由于某种原因无法运行ffmpeg。
    Exception : Cannot run program "ffmpeg": error=2, No such file or directory

    最佳答案

    TL; DR-应用程序找不到ffmpeg,因为您的代码在容器操作系统中运行时,已将其安装在主机操作系统上。要解决此问题,请通过编写自定义Dockerfileffmpeg安装在您的容器中。

    软件容器

    现在,为了更好地理解您的问题,您必须了解软件容器是一种特殊的虚拟化。也就是说,容器内部的操作系统与主机操作系统以及同一台计算机上的其他容器(无论是笔记本电脑还是EC2实例)完全分开。容器可能会与主机OS或同一台计算机上的其他容器共享一些信息,但是您需要执行显式操作才能实现此目的(即Docker卷)。

    Docker容器是一种特定类型的软件容器。通常,可以在官方What is Docker页面中找到有关Docker和容器的一些基本信息。

    容器与虚拟机

    容器与虚拟机有点相似,但是在我看来,两者之间的差异远大于相似之处。从某种意义上说,它们是相似的,它们使您可以在同一硬件上运行多个应用程序,而每个应用程序都具有自己的单独的虚拟环境。它们在虚拟化方面与VM有所不同-VM上的应用程序与同一主机上的其他应用程序共享相同的硬件,而容器内的应用程序共享主机的硬件和操作系统两者的

    容器中的代码是隔离的!

    Docker容器利用Linux操作系统的specific capabilities为每个应用程序提供了一个几乎独立的环境。每个容器都生活在一个虚拟隔离的环境中,这使其感觉好像拥有自己的文件系统,网络,进程ID等。这意味着容器内发生的任何事情都不会影响主机,反之亦然。

    因此,在使用Docker容器时,通常不会在主机上做很多事情。例如,在您的情况下,将ffmpeg安装在主机上,然后尝试从容器中使用它是错误的。即使有可能,它也违反了使用Docker的全部目的。正确的方法是将所有依赖项安装在容器
    内的中。它不仅可以解决No such file问题,还可以让您在自己喜欢的任何位置(AWS,GCP,笔记本电脑...)运行容器,并且始终可以完全相同地工作。这种可移植性是容器独有的,并且是人们使用容器的主要原因之一,因为它始终在完全相同的环境中运行,因此可以使您的代码具有一致的行为。

    用代码打包您的环境

    另一种看待它的方式是-使用Docker时,您将执行环境与代码打包在一起。通过使用 Dockerfile 以非常有效和紧凑的方式完成此操作。您只需在代码所在的根目录中包含一个Dockerfile。 Dockerfile包含创建代码以运行所需的环境所需的所有指令。在Dockerfile中,您可以安装依赖项,复制文件,更改权限并执行许多其他操作。然后,构建一个图像,可以从中启动容器。

    使用Dockerfiles还可以让您对依赖项进行版本控制,并很好地替代了Chef,Ansible和Puppet等配置管理工具。

    我建议您看看Docker网站上的official training videos。他们将使您更好地了解Docker是什么以及如何使用它。

    结论

    总而言之,如果您只想在Elastic Beanstalk上运行代码,则不必使用Docker。您可能可以使它在Beanstalk的Java环境上运行(尽管我自己从来没有做过)。但是,如果要对应用程序进行Docker化,首先需要对Docker有更好的了解,因为使用容器需要转变的观点,但这并不总是容易做到的。

    关于scala - Elastic BeanStalk Docker应用程序,写入本地文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40820577/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com