因此,让我们进入代码。如果我在本地运行该函数,先前我就已成功运行如下所示:
var ffProbe = new NReco.VideoInfo.FFProbe();
ffProbe.FFProbeExeName = "ffprobe.exe"; // just "ffprobe" for Linux/OS-X
ffProbe.ToolPath = "C:\\tools\\ffmpeg\\bin";
var videoInfo = ffProbe.GetMediaInfo(videoUrl);
现在,(再次强调,据我所知这是最佳方式),要在Linux环境下使用Docker运行它,我遇到了一些问题。
因此,第一次尝试采用了简单的方法,即apt-get install ffmpeg。以下是Dockerfile(抱歉,这将是一篇很长的文章...但最好展示所有内容):
FROM mcr.microsoft.com/dotnet/core/sdk:3.1 AS installer-env
# 0. Install essential packages
RUN apt-get -y update
RUN apt-get -y upgrade
RUN apt-get install -y ffmpeg
ENV AzureWebJobsStorage=""
COPY . /src/dotnet-function-app
RUN cd /src/dotnet-function-app && \
mkdir -p /home/site/wwwroot && \
dotnet publish *.csproj --output /home/site/wwwroot
RUN mkdir -p /home/site/wwwroot/bin
RUN mv /usr/bin/* /home/site/wwwroot/bin
# To enable ssh & remote debugging on app service change the base image to the one below
# FROM mcr.microsoft.com/azure-functions/dotnet:3.0-appservice
FROM mcr.microsoft.com/azure-functions/dotnet:3.0
ENV AzureWebJobsScriptRoot=/home/site/wwwroot \
AzureFunctionsJobHost__Logging__Console__IsEnabled=true
COPY --from=installer-env ["/home/site/wwwroot", "/home/site/wwwroot"]
我修改了代码为
var ffProbe = new NReco.VideoInfo.FFProbe();
ffProbe.FFProbeExeName = "ffprobe"; // just "ffprobe" for Linux/OS-X
ffProbe.ToolPath = "/home/site/wwwroot/bin";
var videoInfo = ffProbe.GetMediaInfo(videoUrl);
我编译代码后出现错误:加载共享库libavdevice.so.58时出错
因此,我进行了一些调查,发现我需要手动构建。虽然这并不是最理想的选择,但我尝试了一下并修改了Dockerfile文件:
FROM mcr.microsoft.com/dotnet/core/sdk:3.1 AS installer-env
# 0. Install essential packages
RUN apt-get update -qq && apt-get -y install \
autoconf \
automake \
build-essential \
cmake \
git-core \
libass-dev \
libfreetype6-dev \
libsdl2-dev \
libtool \
libva-dev \
libvdpau-dev \
libvorbis-dev \
libxcb1-dev \
libxcb-shm0-dev \
libxcb-xfixes0-dev \
pkg-config \
texinfo \
wget \
zlib1g-dev \
nasm \
yasm \
libx265-dev \
libnuma-dev \
libvpx-dev \
libmp3lame-dev \
libopus-dev \
libx264-dev
RUN mkdir -p /home/site/wwwroot
RUN mkdir -p /home/site/wwwroot/ffmpeg_sources /home/site/wwwroot/bin && cd /home/site/wwwroot/ffmpeg_sources && \
wget -O ffmpeg-4.3.1.tar.bz2 https://ffmpeg.org/releases/ffmpeg-4.3.1.tar.bz2 && \
tar xjvf ffmpeg-4.3.1.tar.bz2 && \
cd ffmpeg-4.3.1 && \
PATH="/home/site/wwwroot/bin:$PATH" PKG_CONFIG_PATH="/home/site/wwwroot/ffmpeg_build/lib/pkgconfig" ./configure \
--prefix="/home/site/wwwroot/ffmpeg_build" \
--pkg-config-flags="--static" \
--extra-cflags="-I/home/site/wwwroot/ffmpeg_build/include" \
--extra-ldflags="-L/home/site/wwwroot/ffmpeg_build/lib" \
--extra-libs="-lpthread -lm" \
--bindir="/home/site/wwwroot/bin" \
--enable-gpl \
--enable-libass \
--enable-libfreetype \
--enable-libmp3lame \
--enable-libopus \
--enable-libvorbis \
--enable-libvpx \
--enable-libx264 \
--enable-libx265 \
--enable-nonfree && \
PATH="/home/site/wwwroot/bin:$PATH" make -j8 && \
make install -j8 && \
hash -r
ENV AzureWebJobsStorage=""
COPY . /src/dotnet-function-app
RUN cd /src/dotnet-function-app && \
dotnet publish *.csproj --output /home/site/wwwroot
FROM mcr.microsoft.com/azure-functions/dotnet:3.0
ENV AzureWebJobsScriptRoot=/home/site/wwwroot \
AzureFunctionsJobHost__Logging__Console__IsEnabled=true
COPY --from=installer-env ["/home/site/wwwroot", "/home/site/wwwroot"]
再次构建后,我尝试运行,这次出现了同样的错误,但是是针对另一个文件:error while loading shared libraries: libxcb.so.1
所以,我应该提到Docker对我来说有点新,所以我可能会忽略一些简单的东西。但我一整晚都在努力解决问题,直到我决定需要一些建议。我的主要应用程序也托管在Linux机器上,所以那里是不行的。除了Azure函数方法之外,另一个疯狂的想法是启动一个低优先级的Windows虚拟机,大约花费20美元每月......但然后我必须配置IIS和所有这些东西。因此,弄清楚我做错了什么或者它是否可行将是很好的。我之前已经使用Docker和Azure功能使Python / Selenium正常工作,基于https://github.com/rebremer/azure-function-selenium..,因此我希望只是我对Docker还不够熟悉。
如果您能帮助我让这个工作起来,我将非常感激。如果您有任何问题,请随时问我。
谢谢!