dappを䜿甚したプロゞェクトの構築。 パヌト1Java



この蚘事は、さたざたな蚀語、プラットフォヌム、およびテクノロゞヌスタックでのdappアプリケヌションの構築に関するシリヌズの始たりです。 dappに関する以前の蚘事蚘事の最埌にあるリンクを参照はより䞀般的であり、dappの可胜性に぀いお説明したした。 次に、より実質的に話し合い、プロゞェクトで特定の経隓を共有したす。 dapp 0.26.2の最近のリリヌスに関連しお、YAMLファむルでアセンブリを蚘述する方法も瀺したす。

2019幎8月13日曎新 dappプロゞェクトの名前がwerfに倉曎され、そのコヌドがGoに曞き換えられ、ドキュメントが倧幅に改善されたした。

dockersamplesリポゞトリ-atsea-sample-shop-appの䟋を䜿甚しお、アセンブリを説明したす。 これは、ReactフロントずJava Spring Bootバック゚ンドで構築された小さなストアプロトタむプです。 PostgreSQLがデヌタベヌスずしお䜿甚されたす。 䜜業䞭のプロゞェクトにより䌌たものにするために、nginxのリバヌスプロキシず単玔なスクリプト圢匏の支払いゲヌトりェむが远加されたす。

この蚘事では、アプリケヌションのみのアセンブリに぀いお説明したす。nginx 、PostgresSQL、およびゲヌトりェむを備えたむメヌゞは、 dappfileブランチのフォヌクにありたす。

「珟状のたた」アプリケヌションをビルドする


リポゞトリのクロヌンを䜜成するず、完成したJavaおよびReactアプリケヌション甚のDockerfileはpath /app/Dockerfileたす。 このファむルは、2぀のステヌゞむメヌゞdappではアヌティファクトですず1぀の最終むメヌゞを定矩したす。 段階的に、jar内のJavaアプリケヌションず/静的ディレクトリ内のReactアプリケヌションがアセンブルされたす。

 FROM node:latest AS storefront WORKDIR /usr/src/atsea/app/react-app COPY react-app . RUN npm install RUN npm run build FROM maven:latest AS appserver WORKDIR /usr/src/atsea COPY pom.xml . RUN mvn -B -f pom.xml -s /usr/share/maven/ref/settings-docker.xml dependency:resolve COPY . . RUN mvn -B -s /usr/share/maven/ref/settings-docker.xml package -DskipTests FROM java:8-jdk-alpine RUN adduser -Dh /home/gordon gordon WORKDIR /static COPY --from=storefront /usr/src/atsea/app/react-app/build/ . WORKDIR /app COPY --from=appserver /usr/src/atsea/target/AtSea-0.0.1-SNAPSHOT.jar . ENTRYPOINT ["java", "-jar", "/app/AtSea-0.0.1-SNAPSHOT.jar"] CMD ["--spring.profiles.active=postgres"] 

開始するには、このファむルを「そのたた」「クラシック」Dappfileに䜜成し、次にdappfile.ymlたす。

Dappfileは、Rubyブロックのためにより冗長です。

 dimg_group do artifact do #    Java- docker.from 'maven:latest' git do add '/app' do to '/usr/src/atsea' end end shell do install do run 'cd /usr/src/atsea' run 'mvn -B -f pom.xml -s /usr/share/maven/ref/settings-docker.xml dependency:resolve' run 'mvn -B -s /usr/share/maven/ref/settings-docker.xml package -DskipTests' end end export '/usr/src/atsea/target/AtSea-0.0.1-SNAPSHOT.jar' do to '/app/AtSea-0.0.1-SNAPSHOT.jar' after :install end end artifact do #    React- docker.from 'node:latest' git do add '/app/react-app' do to '/usr/src/atsea/app/react-app' end end shell do install do run 'cd /usr/src/atsea/app/react-app' run 'npm install' run 'npm run build' end end export '/usr/src/atsea/app/react-app/build' do to '/static' after :install end end dimg 'app' do docker.from 'java:8-jdk-alpine' shell do before_install do run 'mkdir /app' run 'adduser -Dh /home/gordon gordon' end end docker do entrypoint "java", "-jar", "/app/AtSea-0.0.1-SNAPSHOT.jar" cmd "--spring.profiles.active=postgres" end end end 

「クラシック」Dappfileは、2月のリリヌスたでdappで䜿甚可胜であったアヌティファクトオプション付きの゚クスポヌトです。 COPY --fromのCOPY --fromディレクティブずは異なりたす。これは、最終むメヌゞの説明ではなく、䜕をどこにコピヌするかを瀺すアヌティファクトです。 䜕かのアセンブリの1぀の結果をコピヌする必芁があるほが同じ画像を蚘述する方が簡単です。 珟圚、バヌゞョン0.26.2から、dapp はむンポヌトメカニズムをサポヌトしおいたす 。これは、䜿甚するこずをお勧めしたす以䞋の䜿甚䟋を参照 。

そしお、ファむルに関するもう1぀のコメント。 docker build堎合、コンテキストはDocker Engineに送信されたす。 これは通垞、Dockerfileずアプリケヌションの゜ヌスコヌドがあるディレクトリです。 dappの堎合、コンテキストはGitリポゞトリであり、その履歎によるず、dappは最埌のビルド以降に発生した倉曎を蚈算し、最終むメヌゞで倉曎されたもののみを倉曎したす。 ぀たり、 --fromで--fromしないCOPYディレクティブに類䌌するのは、リポゞトリのどのディレクトリたたはファむルを最終むメヌゞにコピヌするか、どこに眮くか、どの所有者を割り圓おるかを蚘述するgitディレクティブです。 たた、再構成が䟝存する倉曎に぀いおも説明したすが、それに぀いおは埌で詳しく説明したす。 ここでは、新しいYAML構文で同じアセンブリがどのように芋えるかを芋おみたしょう。

 artifact: appserver from: maven:latest git: - add: '/app' to: '/usr/src/atsea' shell: install: - cd /usr/src/atsea - mvn -B -f pom.xml -s /usr/share/maven/ref/settings-docker.xml dependency:resolve - mvn -B -s /usr/share/maven/ref/settings-docker.xml package -DskipTests --- artifact: storefront from: node:latest git: - add: /app/react-app to: /usr/src/atsea/app/react-app shell: install: - cd /usr/src/atsea/app/react-app - npm install - npm run build --- dimg: app from: java:8-jdk-alpine shell: beforeInstall: - mkdir /app - adduser -Dh /home/gordon gordon import: - artifact: appserver add: '/usr/src/atsea/target/AtSea-0.0.1-SNAPSHOT.jar' to: '/app/AtSea-0.0.1-SNAPSHOT.jar' after: install - artifact: storefront add: /usr/src/atsea/app/react-app/build to: /static after: install docker: ENTRYPOINT: ["java", "-jar", "/app/AtSea-0.0.1-SNAPSHOT.jar"] CMD: ["--spring.profiles.active=postgres"] 

すべおが「クラシック」なDappfileに非垞に䌌おいたすが、いく぀かの違いがありたす。 たず、YAML構文を開発するずきに、継承ずネストを攟棄するこずにしたした。 実践が瀺しおいるように、継承は機胜が耇雑すぎお、時々誀解を招きたした。 Dockerfileなどの線圢ファむルははるかに明確です。スクリプトのように芋え、スクリプトはすべおを理解したす。

第二に、アヌティファクトの結果をコピヌするために、ファむルが配眮されるべきdimgでむンポヌトが䜿甚されるようになりたした。 わずかな改善が远加されたした。指定しない堎合、宛先パスはaddで瀺されたものず同じになりたす。

Dappfileを䜜成するずきに䜕を探すべきですか Dockerfileを䜿甚するプロゞェクトの䞀般的な方法は、異なるDockerfileをディレクトリに配眮するこずです。したがっお、 COPYディレクティブのパスは、これらのディレクトリを基準にしお瀺されたす。 Dappfileはプロゞェクト甚のものであり、 gitディレクティブのパスはリポゞトリのルヌトに盞察的です。 2番目のポむントは、 WORKDIRディレクティブです。 Dappfileでは、dockerディレクティブは最埌のステップで実行されるため、 cd呌び出しを䜿甚しお段階的に目的のディレクトリに移動したす。

ビルドの改善


Javaアプリケヌションのビルドは、少なくずも2぀のステップに分割できたす。䟝存関係をダりンロヌドしお、アプリケヌションをビルドしたす。 最初のステップはpom.xml倉曎に䟝存し、2番目はJavaファむル、蚘述子、リ゜ヌスの倉曎に䟝存したす。䞀般に、srcディレクトリの倉曎はjarの再構築に぀ながるず蚀えたす。 before_installは4぀の段階がありたす before_install ゜ヌスがない堎合およびinstall 、 before_setup 、 setup  gitディレクティブで指定されたパスで゜ヌスが既に利甚できる堎合。

䟝存関係のダりンロヌドをより積極的にするには、 dependency:resolveではなく、mavenのdependency:go-offlineタヌゲットを指定しdependency:resolve 。 これは合理的な決定かもしれたせん。 pom.xmlはあたり頻繁に倉曎されたせんが、 dependency:resolveはすべおをダりンロヌドせず、アプリケヌションのビルド段階で、Mavenリポゞトリヌ䞭倮たたはネクサス/アヌティファクト/ ...が呌び出されたす。

合蚈で、䟝存関係をダりンロヌドするステップをinstallステヌゞに移動できたす。 installステヌゞは、 pom.xmlぞの倉曎たでキャッシュに残り、アプリケヌションアセンブリをsetupステヌゞに移動しお、 srcディレクトリに倉曎の䟝存関係を曞き蟌みsetup 。

 artifact: appserver from: maven:latest git: - add: /app to: /usr/src/atsea stageDependencies: install: ['pom.xml'] setup: ['src'] shell: install: - cd /usr/src/atsea - mvn -B -f pom.xml -s /usr/share/maven/ref/settings-docker.xml dependency:go-offline setup: - cd /usr/src/atsea - mvn -B -s /usr/share/maven/ref/settings-docker.xml package -DskipTests 

Reactアプリケヌションの構築は 、 install段階で䟝存関係をダりンロヌドinstall段階ず、 setup段階でアプリケヌションを構築install段階の2段階に分けるこずもできsetup 。 䟝存関係は/app/react-app/package.json説明されおい/app/react-app/package.json 。

 artifact: storefront from: node:latest git: - add: /app/react-app to: /usr/src/atsea/app/react-app stageDependencies: install: ['package.json'] setup: ['src', 'public'] shell: install: - cd /usr/src/atsea/app/react-app - npm install setup: - cd /usr/src/atsea/app/react-app - npm run build 

stageDependenciesのパスは、 add指定されたパスに関連しおいるこずに泚意しおください。

コミットずキャッシュ


次に、 stageDependenciesどのようにstageDependenciesするかを芋おみたしょう。 これを行うには、javaファむルを倉曎しおコミットし、 dapp dimg buildアセンブリを実行したす。 ログでは、 setupステヌゞのみが行われるこずがsetup 。

 Setup group Git artifacts: apply patches (before setup) ... [OK] 1.7 sec signature: dimgstage-atsea-sample-shop-app:e543a0f90ba39f198b9ae70a6268acfe05c6b3a6e25ca69b1b4bd7414a6c1067 Setup [BUILDING] [INFO] Scanning for projects... [INFO] [INFO] ------------------------------------------------------------------------ [INFO] Building atsea 0.0.1-SNAPSHOT [INFO] ------------------------------------------------------------------------ ... [INFO] ------------------------------------------------------------------------ [INFO] BUILD SUCCESS [INFO] ------------------------------------------------------------------------ [INFO] Total time: 39.283 s [INFO] Finished at: 2018-02-05T13:18:47Z [INFO] Final Memory: 42M/355M [INFO] ------------------------------------------------------------------------ Setup [OK] 46.71 sec signature: dimgstage-atsea-sample-shop-app:264aeb0287bbe501798a0bb19e7330917f3ec62b3a08e79a6c57804995e93137 commands: cd /usr/src/atsea mvn -B -s /usr/share/maven/ref/settings-docker.xml package -DskipTests building artifact `appserver` [OK] 49.12 sec 

pom.xmlを倉曎し、ビルドをコミットしお実行するず、ダりンロヌドされた䟝存関係を䜿甚しおinstall段階が再構築され、 setup段階が実行されたす。

䟝存関係


Javaアプリケヌション甚に2぀のステップにアセンブリを分割するず、䟝存関係がキャッシュされ、 installステヌゞむメヌゞが䟝存関係ストアずしお機胜するようになりたした。 ただし、dappには、この皮のストレヌゞ甚のディレクトリをマりントする機胜がありたす。 tmp_dir䞀時ディレクトリからマりントできたす。䞀時ディレクトリの有効期間は1぀のアセンブリであり、 build_dirからbuild_dirできたす。これは各プロゞェクトに固有の氞続的なディレクトリです。 ドキュメントにはDappfileのディレクティブが含たれおおり、アプリケヌションの堎合、 build_dirからbuild_dirにマりントサブディレクトリを远加する方法を瀺したす。

  artifact: appserver from: maven:latest > mount: > - from: build_dir > to: /usr/share/maven/ref/repository git: ... shell: install: ... 

--build-dirフラグを指定しない堎合、dappは~/.dapp/builds/< dapp>たす。 build_dirは、ビルド埌にmountディレクトリが衚瀺されたす。このディレクトリには、マりントされたディレクトリのツリヌがありたす。 プロゞェクト名は、Gitリポゞトリを含むディレクトリの名前ずしお蚈算されたす。 同じディレクトリからプロゞェクトを収集する堎合、プロゞェクト名を--nameフラグで瀺すか、たたは--build-dirフラグを䜿甚しお異なるディレクトリを明瀺的に指定できたす。 この堎合、名前dappはプロゞェクトのGitリポゞトリが保存されおいるディレクトリから蚈算されるため、 ~/.dapp/builds/atsea-sample-shop-app/mount/usr/share/maven/ref/repository/たす

䜜成を実行する


これに぀いおは前に蚀及したせんでしたが、dappを䜿甚しおビルドし、docker-composeを䜿甚しお怜蚌のためにプロゞェクトを実行できたす。 開始するには、画像のタグを䜜成し、dappによっお収集された画像が䜿甚されるようにdocker docker-compose.ymlを修正する必芁がありたす。

むメヌゞをテストする最も簡単な方法は、フラグなしでdapp dimg tagを実行するこずdapp dimg tag  2019幎8月13日曎新 werfでは、タグ付けの実装方法が少し異なりたす。 ドキュメントを参照しおください 。 このコマンドは、 latestタグずずもに画像名を衚瀺したす。 次にdocker-compose.ymlを修正する必芁がありたす。 buildディレクティブを削陀し、 dapp dimg tag出力からimage名を持぀imageディレクティブを远加したす。

䟋

  payment_gateway: image: atsea-sample-shop-app/payment-gateway 

これで、 docker-compose upプロゞェクトを開始できたす䜕らかの理由でビルドが残っおいる堎合は、 --no-buildフラグが圹立ちたす。



サむトはロヌカルホストで利甚可胜です8080



PS


蚘事の次の郚分では、以䞋の投祚の結果に基づいお、PHPたたはNode.jsでのアプリケヌションの構築に぀いお説明したす。

ブログもご芧ください。

Source: https://habr.com/ru/post/J348436/


All Articles