我有一个Play scala应用程序,我通过AWS Elasticbeanstalk控制台将其部署为通用docker应用程序。当我在本地运行应用程序时,我没有看到任何问题,所以我认为代码是正确的。 我需要有能力
但是,我的应用程序不会写入本地磁盘,也不会让我执行命令行实用程序。
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
答案 0 :(得分:1)
TL; DR - ffmpeg
找不到,因为您在主机操作系统上安装了它,而代码在容器中运行操作系统。要解决此问题,请通过编写自定义Dockerfile来在容器中安装ffmpeg
。
现在,为了更好地理解您的问题,您必须了解软件容器是一种特殊的虚拟化。也就是说,容器内的操作系统与主机操作系统以及同一台计算机上的其他容器完全分离,无论是笔记本电脑还是EC2实例。容器可能与主机操作系统或同一台机器上的其他容器共享某些信息,但是为了达到这个目的,您需要进行显式操作(即Docker卷)。
Docker容器是特定类型的软件容器。有关Docker和容器的一些基本信息可以在官方What is Docker页面中找到。
容器与虚拟机有点类似,但在我看来,两者之间的差异比相似之处更多。它们是相似的,它们允许您在同一硬件上运行多个应用程序,而每个应用程序都有自己独立的虚拟环境。它们与虚拟化类中的虚拟机不同 - 而虚拟机上的应用程序与同一主机上的其他应用程序共享相同的硬件,容器内的应用程序共享< strong>主机的硬件和操作系统。
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,因为使用容器需要改变观点,这并不总是那么容易。