FastReport.Mono。 パート2:DockerコンテナーでのWebレポート





本書の前の部分で 、FastReport.MonoデモWebレポートの実行方法について説明しました。 今、私は新しいレベルに移行し、Dockerコンテナに必要なすべてのコンポーネントを「ラップ」することを提案します。





理解しなさい、天国で彼らは海についてだけ言う。 なんて美しいのか......


コンテナはスタイリッシュでファッショナブルで、 性的に若々しいため、近年、誰もがDockerについて話題になっています。 多くの開発者と管理者は、明確な理由もなくDockerをビジネスに使用しています。 しかし、あなたが本当にそれを必要とし、それが面白いなら、猫の下で歓迎します。 最初の部分とは異なり、最大のテキストと最小の画像があります。



既に述べたように、FastReport.Monoを正しく動作させるには、2つのコンテナが必要になる場合があります。





Dockerリポジトリからdebian:stretchイメージに基づいて両方のコンテナを作成します。



FRMonoコンテナー



すでに述べたように、最初のコンテナにはApache 2.4が含まれます。 さらに、アセンブル時に、すぐにMonoとFastReporをそこに追加します。



原則として、Dockerfileを展開し、Oracle Instant Clientの自動インストールを整理することを妨げるものはありませんが、 この記事は、Webレポートのデモに特化したものです。これは必要ありません。



Dockerfile
FROM debian:stretch ENV TZ Europe/Moscow ENV DEBIAN_FRONTEND noninteractive ENV DISPLAY :1 WORKDIR / RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone RUN echo "nameserver 8.8.8.8" > /etc/resolv.conf RUN ["mkdir", "-p", "/opt/fastreport/htdocs/bin"] RUN apt-get update \ && apt-get -y install apt-utils \ && apt-get -y install unzip \ && apt-get -y install mono-complete mono-xsp apache2 libapache2-mod-mono # Apache setup COPY 001-mono.conf /etc/apache2/sites-available/001-mono.conf RUN /usr/sbin/update-rc.d apache2 disable \ && /usr/sbin/a2dismod mod_mono_auto \ && /usr/sbin/a2dissite 000-default \ && /usr/sbin/a2ensite 001-mono # FastReport.Mono setup # Download official Demo ADD https://www.fastreport.ru/public_download/frmono_demo.zip /tmp/frmono_demo.zip # Or add from local filesystem #COPY frmono_demo.zip /tmp/frmono_demo.zip # Extract and copy to destinations RUN ["unzip", "/tmp/frmono_demo.zip", "-d", "/tmp/frmono.demo"] RUN cp -rp /tmp/frmono.demo/Demos/C#/Web/* /opt/fastreport/htdocs RUN cp /tmp/frmono.demo/FastReport.*.dll /opt/fastreport/htdocs/bin RUN chown -R www-data:www-data /opt/fastreport # Volume for X11 unix socket VOLUME /tmp/.X11-unix # Start Apache in foreground to prevent container exit CMD ["/usr/sbin/apachectl", "-DFOREGROUND"]
      
      





実際、設定するのに複雑なものやトリッキーなものはありません。 注意すべき主なことは、Apacheをバックグラウンドプロセスとして実行する必要はなく、Apacheをフォアグラウンドに配置する必要があることです。 それ以外の場合、コンテナは起動後すぐに作業を完了します。



原則として、Apacheの仮想ホスト構成ファイルは、本書の最初の部分に記載されている構成の簡略版です。 ただし、いくつかの違いがあります。 これは、わずかに異なるディレクトリ構造が使用されるという事実によるものです(binディレクトリ内のライブラリの配置)。



これらのアプローチには特に違いはありません。 さらに、コンテナはポート80を安全に使用できます。



001-mono.conf
 <VirtualHost *:80> DocumentRoot "/opt/fastreport/htdocs" <IfModule mod_mono.c> MonoUnixSocket FrSite /tmp/.mod_mono_server MonoServerPath FrSite /usr/bin/mod-mono-server4 MonoPath FrSite /usr/lib/mono/4.5:/usr/lib:/usr/lib/mono/4.0 AddMonoApplications FrSite "/:/opt/fastreport/htdocs" MonoAutoApplication Disabled MonoDocumentRootDir /opt/fastreport/htdocs MonoDebug false MonoSetEnv FrSite DISPLAY=:1;HOME=/opt/fastreport AddHandler mono .aspx .ascx .asax .ashx .config .cs .asmx .axd </IfModule> <Directory "/opt/fastreport/htdocs"> Require all granted Options Indexes FollowSymLinks MultiViews AllowOverride All <IfModule mod_mono.c> SetHandler mono MonoSetServerAlias FrSite DirectoryIndex Default.aspx </IfModule> </Directory> <Directory "/opt/fastreport/htdocs/bin"> Require all denied </Directory> </VirtualHost>
      
      







アセンブリプロセスを開始します。



 docker build -t debian-stretch-mono:latest .
      
      





X11Dummyコンテナー



この一連の出版物の最初の部分で 、System.Windows.Formsを使用するにはXサーバーが必要であることをすでに述べました。 なぜなら Apache、Mono、FastReportのコンテナには「X」はありません。どこからでも取得する必要があります。



次の2つのオプションが可能です。





最初のオプションでは、使用するOSに応じて異なる設定が必要です。 実際、Linuxでは、たとえばX.org 、Mac OSではXQuartz 、WindowsではXmingを配信する必要があります。

2番目のオプションは、Dockerの概念とより整合性があり、ホストOSシステムから独立した、簡単に移植できるものを作成できます。 コンテナ間の相互作用は、tcpまたはUNIXソケットを介して実行できます。 私の意見では、Unixソケットを使用するオプションは、この問題を解決するのに最適です。



Dockerfile
 FROM debian:stretch ENV TZ Europe/Moscow ENV DEBIAN_FRONTEND noninteractive ENV DISPLAY :1 RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone RUN echo "nameserver 8.8.8.8" > /etc/resolv.conf RUN apt-get update \ && apt-get -y install apt-utils \ && apt-get -y install xserver-xorg-video-dummy x11-apps VOLUME /tmp/.X11-unix COPY xorg.mini.conf /etc/X11/xorg.conf CMD /usr/bin/Xorg -noreset +extension GLX +extension RANDR +extension RENDER -logfile /tmp/xdummy.log -config /etc/X11/xorg.conf $DISPLAY
      
      





ネタバレの下でDocerfileを注意深く調べた場合、2つの点に注意する必要があります。 1つ目は、 xserver-xorg-video-dummyパッケージのビデオドライバーの使用です。 Xサーバーに画像を表示していることを伝えるが、実際には何もしない「空の」ドライバー。



2つ目は、さまざまな指示に従って、 DISPLAY環境変数を通常の値とは異なる値に設定することです。0。 / tmpホストOSを介してUNIXソケットを突然設定することにした場合の例外的な予防措置。



Xサーバー構成ファイルは、 この構成のテーマのバリエーションであり、ネットワーク全体にさまざまな変更を加えます。 Modeline'ovを大量に含む非常に長いバージョン(偶然、ソースを思い出せませんでした)に出会い、可能な限りそれを圧縮しようとしました(それでも可能だと思います)。



xorg.mini.conf
 Section "ServerFlags" Option "DontVTSwitch" "true" Option "AllowMouseOpenFail" "true" Option "PciForceNone" "true" Option "AllowEmptyInput" "true" Option "AutoEnableDevices" "false" Option "AutoAddDevices" "false" EndSection Section "Device" Identifier "dummy_videocard" Driver "dummy" DacSpeed 600 Option "ConstantDPI" "true" VideoRam 256000 EndSection Section "Monitor" Identifier "dummy_monitor" HorizSync 1.0 - 2000.0 VertRefresh 1.0 - 200.0 Modeline "1920x1080" 23.53 1920 1952 2040 2072 1080 1106 1108 1135 Modeline "1280x1024" 31.50 1280 1312 1424 1456 1024 1048 1052 1076 Modeline "1280x720" 59.42 1280 1312 1536 1568 720 735 741 757 Modeline "1024x768" 18.71 1024 1056 1120 1152 768 786 789 807 EndSection Section "Screen" Identifier "dummy_screen" Device "dummy_videocard" Monitor "dummy_monitor" DefaultDepth 24 SubSection "Display" Viewport 0 0 Depth 8 Modes "1920x1080" "1280x1024" "1280x800" "1024x768" Virtual 8192 4096 EndSubSection SubSection "Display" Viewport 0 0 Depth 16 Modes "1920x1080" "1280x1024" "1280x800" "1024x768" Virtual 8192 4096 EndSubSection SubSection "Display" Viewport 0 0 Depth 24 Modes "1920x1080" "1280x1024" "1280x800" "1024x768" Virtual 8192 4096 EndSubSection SubSection "Display" Viewport 0 0 Depth 30 Modes "1920x1080" "1280x1024" "1280x800" "1024x768" Virtual 8192 4096 EndSubSection EndSection Section "ServerLayout" Identifier "dummy_layout" Screen "dummy_screen" EndSection
      
      







収集するもの:



 docker build -t debian-stretch-x11dummy:latest .
      
      





Docker-composeで起動



サービス管理を容易にするために、 docker-compose十分です。 起動プロセスでは、次のものが必要です。





上記の要件に基づいて、最低限必要なdocker-compose.ymlを取得します。



docker-compose.yml
 version: "2" services: fastreport: container_name: frmono image: debian-stretch-mono:latest volumes: - ./.x11-unixsoc:/tmp/.X11-unix ports: - "127.0.0.1:8085:80" xorg: container_name: x11dummy image: debian-stretch-x11dummy:latest volumes: - ./.x11-unixsoc:/tmp/.X11-unix
      
      







注意 YAMLに慣れていない場合、フォーマットはスペースで行われることに注意してください。



なぜなら unix-socket、これは基本的にファイルであり、プラグインボリューム-コンテナがホストと対話する機能を使用します。 このアプローチでは、両方のコンテナがスタートアップディレクトリにある.x11-unixsocディレクトリを使用してデータを交換します。



実行して確認:



 docker-compose up
      
      





そして、私の友人の一人が言うのが好きなように、「ケーキのチェリー」:Systemdを使用したOS起動時のコンテナー起動の自動化。 すべては2つの簡単なステップで実行されます。 まず、ファイル/etc/system.d/system/docker-frmono.serviceを作成する必要があります。その内容は、ネタバレの下にあります。 なぜおおよそですか? 少なくとも、選択した構成ファイルの場所とdocker-composeのインストール場所に従ってパスを変更する必要があります。



docker-frmono.service
 [Unit] Description=FastReport Docker Requires=docker.service After=docker.service [Service] Restart=always ExecStart=/usr/local/bin/docker-compose -f /opt/frdocker/docker-compose.yml start ExecStop=/usr/local/bin/docker-compose -f /opt/frdocker/docker-compose.yml stop [Install] WantedBy=multi-user.target
      
      







次に、システムにサービスを登録して「有効化」します。



 systemctl daemon-reload systemctl enable docker-frmono
      
      







PS実験中に、一定数の「曲がった」画像を蓄積した可能性は十分にあります。 次のようにしてクリーニングできます。



 docker images | grep "<none>" | awk '{split($0,a," ");print a[3];}' | xargs -I{} docker rmi "{}"
      
      





この記事で使用されているすべての構成ファイルは、 githubで入手できます。



All Articles