2017-11-18 20 views
0

DockerコンテナのHerokuで実行するために古い.NET Web APIアプリケーションを移植しています。私はそうするためにモノ画像を使用しています。HerokuのDockerコンテナからXサーバーにアクセス

は、ここに私のDockerfileです:

FROM mono:latest 
EXPOSE 5000 
ENV PORT 5000 
ADD ./ /api 
WORKDIR /api 
RUN nuget restore -NonInteractive 
RUN msbuild webapi.sln /p:Configuration=Release 
CMD mono /api/MyProject/bin/Release/MyProject.exe port:$PORT 

かなり簡単、ソリューションを構築し、それを実行し、NuGetパッケージを復元し、ソースをコピーして、最新のモノ画像を使用しています。 $ PORT環境変数はHerokuによって設定されるか、私のローカル開発環境ではデフォルトで5000に設定されます。

PDFレポートを生成する特定のAPIコントローラを除いて、すべてがうまくいきます。このレポートは、必要なレンダリングのためにSystem.Drawingアセンブリに依存するPdfSharpによって生成されます。しかし、これはディスプレイに依存することを意味します。

レポートを生成するためにそのコントローラを呼び出すと、次のエラーが発生します。

Could not open display (X-Server required. Check your DISPLAY environment variable). 

必要なレンダリングを行うには、Xサーバーにアクセスする必要があります。私は数多くのことを試しましたが、常にこのエラーで立ち往生しています。

答えて

0

X11ディスプレイサーバープロトコルを実装するディスプレイサーバーであるXvfb(virtual framebuffer)をインストールすることで動作しました。以下の更新されたDockerfileをご覧ください。

備考:ディスプレイサーバーとは別に、PDFSharpをMono上で実行することにはより多くの問題がありました。私はまた、aptソースを更新して、Microsoft Core Fontsをインストールしなければならなかった。 また、フォントを見つける方法を知っているPDFSharpの修正版を使用しなければなりませんでした。幸いにもこれは既に私のために行った:

https://github.com/daniellor/PDFsharp

関連するコードはここにある:

https://github.com/daniellor/PDFsharp/blob/master/src/PdfSharp/Fonts/FontLocalizator.cs

Aはハックビットと、あなたのセットアップに合わせて、それを修正する必要があるかもしれませんが、それはありません仕事。 MonoReleaseビルドを作成してこのアセンブリを参照するだけでよいです。

Dockerfile

FROM mono:latest 

# Update the sources.list for apt-get so it knows where to download the Microsoft Core fonts. 
RUN echo "deb http://gce_debian_mirror.storage.googleapis.com wheezy contrib non-free" >> /etc/apt/sources.list \ 
    && echo "deb http://gce_debian_mirror.storage.googleapis.com wheezy-updates contrib non-free" >> /etc/apt/sources.list \ 
    && echo "deb http://security.debian.org/ wheezy/updates contrib non-free" >> /etc/apt/sources.list 

# Install Xvfb and the Microsoft core fonts 
RUN apt-get update 
RUN apt-get install -y xvfb ttf-mscorefonts-installer 

# Configure Xvfb as a daemon. 
ADD xvfb.init /etc/init.d/xvfb 
RUN chmod +x /etc/init.d/xvfb 
RUN update-rc.d xvfb defaults 

EXPOSE 5000 
ENV PORT 5000 
ADD ./ /api 
WORKDIR /api 
RUN nuget restore -NonInteractive 
RUN msbuild webapi.sln /p:Configuration=Release 

# Start Xvfb and the Web Api 
CMD (service xvfb start; export DISPLAY=:10; mono /api/MyProject/bin/Release/MyProject.exe port:$PORT) 

xvfb.init

#!/bin/bash 
# 
# /etc/rc.d/init.d/xvfbd 
# 
# chkconfig: 345 95 28 
# description: Starts/Stops X Virtual Framebuffer server 
# processname: Xvfb 
# 

[ "${NETWORKING}" = "no" ] && exit 0 

PROG="/usr/bin/Xvfb" 
PROG_OPTIONS=":10 -ac" 
PROG_OUTPUT="/tmp/Xvfb.out" 

case "$1" in 
    start) 
     echo -n "Starting : X Virtual Frame Buffer " 
     $PROG $PROG_OPTIONS>>$PROG_OUTPUT 2>&1 & 
     disown -ar 
     ;; 
    stop) 
     echo -n "Shutting down : X Virtual Frame Buffer" 
     killproc $PROG 
     RETVAL=$? 
     [ $RETVAL -eq 0 ] && /bin/rm -f /var/lock/subsys/Xvfb/var/run/Xvfb.pid 
     echo 
     ;; 
    restart|reload) 
     $0 stop 
     $0 start 
     RETVAL=$? 
     ;; 
    status) 
     status Xvfb 
     RETVAL=$? 
     ;; 
    *) 
    echo $"Usage: $0 (start|stop|restart|reload|status)" 
    exit 1 
esac 

exit $RETVAL 
関連する問題