.net - 软件包安装在 docker 内,但实际命令提供异常

标签 .net docker .net-core ffmpeg .net-6.0

我正在尝试在 .net 6 dockerized 项目中使用 ffmpeg 核心包。我在 Dockerfile 中安装 ffmpeg 核心,在解决方案中引用实际包 FFMpegCore 但是当我尝试应用 ffmpeg 核心库中的任何命令时,我收到错误

An error occurred trying to start process './ffmpeg' with working directory '/var/task'. No such file or directory


Docker 构建完成,没有错误。
Dockerfile
FROM public.ecr.aws/lambda/dotnet:6 AS base
....
RUN apt-get install -y ffmpeg
....
FROM base AS final
WORKDIR /var/task
COPY --from=publish /app/publish .
根据 ffmpeg core docs 为了使用 ffmpeg 我需要设置它的二进制文件夹,所以我添加了 ffmpeg.config.json
{
  "BinaryFolder": "/var/task",
  "TemporaryFilesFolder": "/tmp"
}
当我尝试执行以下命令时抛出实际错误

An error occurred trying to start process './ffmpeg' with working directory '/var/task'. No such file or directory


这是触发错误的地方
 using FFMpegCore;
 ...
 public class MyController : ControllerBase
    {
        public async Task<string> Get()
        {    
             await FFMpegArguments
                   .FromPipeInput(new StreamPipeSource(myfile))
                   .OutputToPipe(new StreamPipeSink(outputStream), options => options
                      .WithVideoCodec("vp9")
                      .ForceFormat("webm"))
                      .ProcessAsynchronously();
             ...
        }    
    }
更新:
更改后BinaryFolder定位到 /usr/bin我收到以下错误
An error occurred trying to start process '/usr/bin/ffmpeg' with working directory '/var/task'. No such file or directory
更新#2
这是我完整的 Dockerfile
FROM public.ecr.aws/lambda/dotnet:6 AS base

FROM mcr.microsoft.com/dotnet/sdk:6.0-bullseye-slim as build
WORKDIR /src
COPY ["AWSServerless.csproj", "AWSServerless/"]
RUN dotnet restore "AWSServerless/AWSServerless.csproj"

WORKDIR "/src/AWSServerless"
COPY . .
RUN dotnet build "AWSServerless.csproj" --configuration Release --output /app/build

FROM build AS publish   

RUN apt-get update \
    && apt-get install -y apt-utils libgdiplus libc6-dev \
    && apt-get install -y ffmpeg

RUN dotnet publish "AWSServerless.csproj" \
            --configuration Release \ 
            --runtime linux-x64 \
            --self-contained false \ 
            --output /app/publish \
            -p:PublishReadyToRun=true  

FROM base AS final
WORKDIR /var/task

CMD ["AWSServerless::AWSServerless.LambdaEntryPoint::FunctionHandlerAsync"]
COPY --from=publish /app/publish .

最佳答案

您是在告诉它二进制文件在 /var/task 中在 ffmpeg.config.json , 但是 apt-get install -y ffmpeg/usr/bin 中安装 ffmpeg .更改BinaryFolder像这样配置值

{
  "BinaryFolder": "/usr/bin",
  "TemporaryFilesFolder": "/tmp"
}
您还需要安装ffmpeg在 Dockerfile 中的某个点,它将最终出现在最终图像中。现在,您将它安装在 Dockerfile 的构建/发布部分中,该部分不用于最终镜像。
试试这个
FROM public.ecr.aws/lambda/dotnet:6 AS base
# Install ffmpeg
RUN mkdir /ffmpeg && \
    cd /ffmpeg && \
    yum -y install tar xz && \
    curl https://johnvansickle.com/ffmpeg/releases/ffmpeg-release-amd64-static.tar.xz -o ffmpeg.tar.xz -s && \
    tar -xf ffmpeg.tar.xz && \
    mv ffmpeg-*-amd64-static/ffmpeg /usr/bin && \
    cd / && \
    rm -rf ffmpeg

FROM mcr.microsoft.com/dotnet/sdk:6.0-bullseye-slim as build
WORKDIR /src
COPY ["AWSServerless.csproj", "AWSServerless/"]
RUN dotnet restore "AWSServerless/AWSServerless.csproj"

WORKDIR "/src/AWSServerless"
COPY . .
RUN dotnet build "AWSServerless.csproj" --configuration Release --output /app/build

FROM build AS publish   
RUN dotnet publish "AWSServerless.csproj" \
            --configuration Release \ 
            --runtime linux-x64 \
            --self-contained false \ 
            --output /app/publish \
            -p:PublishReadyToRun=true  

FROM base AS final
WORKDIR /var/task

CMD ["AWSServerless::AWSServerless.LambdaEntryPoint::FunctionHandlerAsync"]
COPY --from=publish /app/publish .

关于.net - 软件包安装在 docker 内,但实际命令提供异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72452823/

相关文章:

c# - .NET 示例 VCF 阅读器

docker - 使用 Docker 部署集群(即 MongoDb/ElasticSearch)并链接到 Java 应用程序

c# - .NET Core 和 .NET Framework 之间 Expression.Subtract for DateTime 的差异

java - Word XML 到 RTF 转换

c# - 获取用于转换为 base 64 字符串的图像路径

c# - 在 ASP.NET Core 2.0 中找不到 AddJsonOptions

c# - 触发Web作业执行完全,然后在121秒后超时中止

php - skaffold重建某些文件的图像,而不重建其他文件的图像

docker - 如何将探查器附加到 docker 进程

visual-studio - 无法在 Visual Studio 2017 中调试 .NET 核心项目