{"id":37565,"date":"2019-10-31T22:18:20","date_gmt":"2019-10-31T19:18:20","guid":{"rendered":"https:\/\/prohoster.info\/blog\/sborka-android-proekta-v-docker-kontejnere\/"},"modified":"2019-10-31T22:18:20","modified_gmt":"2019-10-31T19:18:20","slug":"sborka-android-proekta-v-docker-kontejnere","status":"publish","type":"post","link":"https:\/\/prohoster.info\/da\/blog\/administrirovanie\/sborka-android-proekta-v-docker-kontejnere","title":{"rendered":"Opbygning af Android-projekt i en Docker-container","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>N\u00e5r man udvikler et projekt til Android-platformen, uanset hvor lille det er, m\u00e5 man f\u00f8r eller senere st\u00e5 over for udviklingsmilj\u00f8et. Udover Android SDK er det n\u00f8dvendigt at have den nyeste version af Kotlin, Gradle, platform-tools og build-tools. Og mens disse afh\u00e6ngigheder p\u00e5 udviklerens maskine i h\u00f8j grad h\u00e5ndteres ved hj\u00e6lp af Android Studio IDE, kan hver opdatering p\u00e5 CI\/CD-serveren blive en hovedpine. Og hvis Docker er blevet standardl\u00f8sningen p\u00e5 problemet med milj\u00f8et i webudvikling, hvorfor ikke ogs\u00e5 pr\u00f8ve at l\u00f8se et lignende problem i Android-udvikling...<br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><br \/>\nFor dem, der ikke ved, hvad Docker er \u2014 helt simpelt, er det et v\u00e6rkt\u00f8j til oprettelse af s\u00e5kaldte \"containere\", der indeholder et minimum af OS-kernen og det n\u00f8dvendige software, som vi kan implementere, hvor som helst, samtidig med at vi bevarer milj\u00f8et. Hvad der pr\u00e6cist vil v\u00e6re i vores container defineres i Dockerfile, som derefter samles til et billede, der kan k\u00f8res hvor som helst og har egenskaberne ved idempotens.<\/p>\n<p>Processen til installation og grundl\u00e6ggende brug af Docker er beskrevet godt p\u00e5 dens <noindex><a rel=\"nofollow\" href=\"https:\/\/www.docker.com\/get-started\">den officielle hjemmeside<\/a><\/noindex>websted. Derfor, for at springe lidt fremad, her er s\u00e5dan en Dockerfile, vi har f\u00e5et frem.<\/p>\n<pre><code class=\"plaintext\"># \u0422.\u043a. \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u043c \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u043c \u0434\u043b\u044f \u0441\u0431\u043e\u0440\u043a\u0438 Android-\u043f\u0440\u043e\u0435\u043a\u0442\u043e\u0432 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f Gradle, \n# \u0438 \u043f\u043e \u0441\u0447\u0430\u0441\u0442\u043b\u0438\u0432\u043e\u043c\u0443 \u0441\u0442\u0435\u0447\u0435\u043d\u0438\u044e \u043e\u0431\u0441\u0442\u043e\u044f\u0442\u0435\u043b\u044c\u0441\u0442\u0432 \u0435\u0441\u0442\u044c \u043e\u0444\u0438\u0446\u0438\u0430\u043b\u044c\u043d\u044b\u0439 Docker-\u043e\u0431\u0440\u0430\u0437 \n# \u043c\u044b \u0440\u0435\u0448\u0438\u043b\u0438 \u0437\u0430 \u043e\u0441\u043d\u043e\u0432\u0443 \u0432\u0437\u044f\u0442\u044c \u0438\u043c\u0435\u043d\u043d\u043e \u0435\u0433\u043e \u0441 \u043d\u0443\u0436\u043d\u043e\u0439 \u043d\u0430\u043c \u0432\u0435\u0440\u0441\u0438\u0435\u0439 Gradle\nFROM gradle:5.4.1-jdk8\n\n# \u0417\u0430\u0434\u0430\u0435\u043c \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u0441 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e\u0439 \u043f\u0430\u043f\u043a\u043e\u0439 \u0434\u043b\u044f Android SDK \u0438 \n# \u0432\u0435\u0440\u0441\u0438\u044f\u043c\u0438 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u044b \u0438 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u044f\nENV SDK_URL=\"https:\/\/dl.google.com\/android\/repository\/sdk-tools-linux-3859397.zip\" \n    ANDROID_HOME=\"\/usr\/local\/android-sdk\" \n    ANDROID_VERSION=28 \n    ANDROID_BUILD_TOOLS_VERSION=28.0.3\n\n# \u0421\u043e\u0437\u0434\u0430\u0435\u043c \u043f\u0430\u043f\u043a\u0443, \u0441\u043a\u0430\u0447\u0438\u0432\u0430\u0435\u043c \u0442\u0443\u0434\u0430 SDK \u0438 \u0440\u0430\u0441\u043f\u0430\u043a\u043e\u0432\u044b\u0432\u0430\u0435\u043c \u0430\u0440\u0445\u0438\u0432,\n# \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u043e\u0441\u043b\u0435 \u0441\u0431\u043e\u0440\u043a\u0438 \u0443\u0434\u0430\u043b\u044f\u0435\u043c\nRUN mkdir \"$ANDROID_HOME\" .android \n    &amp;&amp; cd \"$ANDROID_HOME\" \n    &amp;&amp; curl -o sdk.zip $SDK_URL \n    &amp;&amp; unzip sdk.zip \n    &amp;&amp; rm sdk.zip \n# \u0412 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0445 \u0441\u0442\u0440\u043e\u0447\u043a\u0430\u0445 \u043c\u044b \u0441\u043e\u0437\u0434\u0430\u0435\u043c \u043f\u0430\u043f\u043a\u0443 \u0438 \u0442\u0435\u043a\u0441\u0442\u043e\u0432\u044b\u0435 \u0444\u0430\u0439\u043b\u044b \n# \u0441 \u043b\u0438\u0446\u0435\u043d\u0437\u0438\u044f\u043c\u0438. \u041d\u0430 \u043e\u0444. \u0441\u0430\u0439\u0442\u0435 Android \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u043e \u0447\u0442\u043e \u043c\u044b \n# \u043c\u043e\u0436\u0435\u043c \u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u044d\u0442\u0438 \u0444\u0430\u0439\u043b\u044b \u0441 \u043c\u0430\u0448\u0438\u043d \u0433\u0434\u0435 \u0432\u0440\u0443\u0447\u043d\u0443\u044e \u044d\u0442\u0438 \n# \u043b\u0438\u0446\u0435\u043d\u0437\u0438\u0438 \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0434\u0438\u043b\u0438 \u0438 \u0447\u0442\u043e \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \n# \u0438\u0445 \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043d\u0435\u043b\u044c\u0437\u044f\n    &amp;&amp; mkdir \"$ANDROID_HOME\/licenses\" || true \n    &amp;&amp; echo \"24333f8a63b6825ea9c5514f83c2829b004d1\" &gt; \"$ANDROID_HOME\/licenses\/android-sdk-license\" \n    &amp;&amp; echo \"84831b9409646a918e30573bab4c9c91346d8\" &gt; \"$ANDROID_HOME\/licenses\/android-sdk-preview-license\"    \n\n# \u0417\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u043c \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435 SDK \u0438 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0443 build-tools, platform-tools\nRUN $ANDROID_HOME\/tools\/bin\/sdkmanager --update\nRUN $ANDROID_HOME\/tools\/bin\/sdkmanager \"build-tools;${ANDROID_BUILD_TOOLS_VERSION}\" \n    \"platforms;android-${ANDROID_VERSION}\" \n    \"platform-tools\"\n<\/code><\/pre>\n<p>\nVi gemmer den i mappen med vores Android-projekt og starter containerbygningen med kommandoen<\/p>\n<pre><code class=\"bash\">docker build -t android-build:5.4-28-27 .<\/code><\/pre>\n<p>\nParameter <i>-t<\/i> angiver tag eller navn p\u00e5 vores container, som normalt best\u00e5r af dens navn og version. I vores tilf\u00e6lde kaldte vi det android-build og i versionen angav vi en kombination af versionerne gradle, android-sdk og platform-tools. Fremover vil det v\u00e6re nemmere for os at finde det \u00f8nskede billede efter navn ved hj\u00e6lp af s\u00e5dan en \"version\".<\/p>\n<p>N\u00e5r byggeriet er f\u00e6rdigt, kan vi bruge vores billede lokalt, eller vi kan uploade det med kommandoen <i>docker push<\/i> til et offentligt eller privat billede-repository, s\u00e5 vi kan downloade det til andre maskiner.<\/p>\n<p>Som et eksempel vil vi lokalt bygge projektet. For at g\u00f8re dette udf\u00f8rer vi kommandoen i mappen med projektet<\/p>\n<pre><code class=\"bash\">docker run --rm -v \"$PWD\":\/home\/gradle\/ -w \/home\/gradle android-build:5.4.1-28-27 gradle assembleDebug<\/code><\/pre>\n<p>\nLad os gennemg\u00e5, hvad den betyder: <\/p>\n<p><i>docker run<\/i> \u2014 selve kommandoen til at starte billedet<br \/>\n<i>-rm<\/i> \u2014 betyder, at n\u00e5r containeren stopper, sletter den alt, hvad der blev oprettet i l\u00f8bet af dens livscyklus<br \/>\n<i>-v &#171;$PWD&#187;:\\\/home\\\/gradle\\\/<\/i> \u2014 mount den nuv\u00e6rende mappe med vores Android-projekt til den interne mappe i containeren \/home\/gradle\/<br \/>\n<i>-w \/home\/gradle<\/i> \u2014 angiver containerens arbejdsmappe<br \/>\n<i>android-build:5.4.1-28-27<\/i> \u2014 navnet p\u00e5 vores container, som vi har bygget<br \/>\n<i>gradle assembleDebug<\/i> \u2014 selve build-kommandoen, der bygger vores projekt<\/p>\n<p>Hvis alt g\u00e5r godt, vil du om et par sekunder\/minutter se noget som dette p\u00e5 din sk\u00e6rm <b>BUILD SUCCESSFUL p\u00e5 8m 3s<\/b>! Og i mappen app\/build\/output\/apk vil den byggede applikation ligge.<\/p>\n<p>P\u00e5 samme m\u00e5de kan andre gradle-opgaver udf\u00f8res \u2014 kontrollere projektet, k\u00f8re tests osv. Den store fordel er, at n\u00e5r projektet skal bygges p\u00e5 en anden maskine, beh\u00f8ver vi ikke bekymre os om at installere hele milj\u00f8et, og vi kan blot downloade det n\u00f8dvendige billede og starte bygningen i det.<\/p>\n<p>Containeren gemmer ikke nogen \u00e6ndringer, og hver build starter fra bunden, hvilket p\u00e5 den ene side garanterer ensartethed i bygningen uanset hvor den startes fra, mens det p\u00e5 den anden side betyder, at man hver gang m\u00e5 downloade alle afh\u00e6ngighederne og kompilere hele koden igen, hvilket nogle gange kan tage betydelig tid. Derfor har vi udover det almindelige 'kolde' opstart ogs\u00e5 mulighed for at starte bygningen med bevarelse af den s\u00e5kaldte 'cache', hvor vi gemmer mappen ~\/ .gradle ved blot at kopiere den til projektets arbejdsmappe, og i starten af den n\u00e6ste bygning returnerer vi den. Alle kopieringsprocedurer har vi samlet i separate scripts, og selve opstartskommanden ser nu s\u00e5dan ud<\/p>\n<pre><code class=\"bash\">docker run --rm -v \"$PWD\":\/home\/gradle\/ -w \/home\/gradle android-build:5.4.1-28-27 \/bin\/bash -c \".\/pre.sh; gradle assembleDebug; .\/post.sh\"<\/code><\/pre>\n<p>\nSom et resultat er den gennemsnitlige tid til at bygge projektet blevet reduceret flere gange (afh\u00e6ngigt af antallet af afh\u00e6ngigheder i projektet, men det gennemsnitlige projekt kan nu bygges p\u00e5 1 minut i stedet for 5 minutter).<\/p>\n<p>Alt dette giver selvf\u00f8lgelig kun mening, hvis du har din egen interne CI\/CD-server, som du selv vedligeholder. Men der er mange cloud-tjenester nu, hvor alle disse problemer er l\u00f8st, og du ikke beh\u00f8ver at bekymre dig om det, da de n\u00f8dvendige byggeegenskaber ogs\u00e5 kan angives i projektindstillingerne.<\/p>\n<p class=\"for_users_only_msg\">Kun registrerede brugere kan deltage i unders\u00f8gelsen. <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/auth\/login\/\">Log ind<\/a><\/noindex>, please.<\/p>\n<h2 class=\"default-block__polling-title\">Har du CI\/CD-systemet internt, eller bruger du en ekstern service?<\/h2>\n<ul class=\"content-list content-list_polling\">\n<li class=\"content-list__item content-list__item_polling\">\n<p>                    Bruger den interne server<\/p>\n<\/li>\n<li class=\"content-list__item content-list__item_polling\">\n<p>                    Bruger eksterne service<\/p>\n<\/li>\n<li class=\"content-list__item content-list__item_polling\">\n<p>                    Bruger ikke CI\/CD<\/p>\n<\/li>\n<li class=\"content-list__item content-list__item_polling\">\n<p>                    Andet<\/p>\n<\/li>\n<\/ul>\n<p>    42 brugere har stemt. 16 brugere har undladt at stemme.<br \/>\n<br \/>Kilde: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/465193\/\">habr.com<\/a><\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u0420\u0430\u0437\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u044f \u043f\u0440\u043e\u0435\u043a\u0442 \u043f\u043e\u0434 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0443 Android, \u0434\u0430\u0436\u0435 \u0441\u0430\u043c\u044b\u0439 \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u043e\u0439, \u0440\u0430\u043d\u043e \u0438\u043b\u0438 \u043f\u043e\u0437\u0434\u043d\u043e \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0441\u0442\u0430\u043b\u043a\u0438\u0432\u0430\u0442\u044c\u0441\u044f \u0441 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u0435\u043c \u0434\u043b\u044f \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438. \u041a\u0440\u043e\u043c\u0435 Android SDK, \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0447\u0442\u043e\u0431\u044b \u0431\u044b\u043b\u0430 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u044f\u044f \u0432\u0435\u0440\u0441\u0438\u044f Kotlin, Gradle, platform-tools, build-tools. \u0418 \u0435\u0441\u043b\u0438 \u043d\u0430 \u043c\u0430\u0448\u0438\u043d\u0435 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430 \u0432\u0441\u0435 \u044d\u0442\u0438 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u0440\u0435\u0448\u0430\u044e\u0442\u0441\u044f \u0432 \u0431\u043e\u043b\u044c\u0448\u0435\u0439 \u043c\u0435\u0440\u0435 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e Android Studio IDE, \u0442\u043e \u043d\u0430 \u0441\u0435\u0440\u0432\u0435\u0440\u0435 CI\/CD \u043a\u0430\u0436\u0434\u043e\u0435 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435 \u043c\u043e\u0436\u0435\u0442 \u043f\u0440\u0435\u0432\u0440\u0430\u0442\u0438\u0442\u044c\u0441\u044f \u0432 [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-37565","post","type-post","status-publish","format-standard","hentry","category-administrirovanie"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 5.0.3 - aioseo.com -->\n\t<meta name=\"description\" content=\"\u0420\u0430\u0437\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u044f \u043f\u0440\u043e\u0435\u043a\u0442 \u043f\u043e\u0434 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0443 Android, \u0434\u0430\u0436\u0435 \u0441\u0430\u043c\u044b\u0439 \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u043e\u0439, \u0440\u0430\u043d\u043e \u0438\u043b\u0438 \u043f\u043e\u0437\u0434\u043d\u043e \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0441\u0442\u0430\u043b\u043a\u0438\u0432\u0430\u0442\u044c\u0441\u044f \u0441 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u0435\u043c \u0434\u043b\u044f \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438.\" \/>\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"Yuri Gagarin\"\/>\n\t<link rel=\"canonical\" href=\"https:\/\/prohoster.info\/da\/blog\/administrirovanie\/sborka-android-proekta-v-docker-kontejnere\" \/>\n\t\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.3\" \/>\n\t\t<meta property=\"og:locale\" content=\"da_DK\" \/>\n\t\t<meta property=\"og:site_name\" content=\"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b\" \/>\n\t\t<meta property=\"og:type\" content=\"article\" \/>\n\t\t<meta property=\"og:title\" content=\"\ud83e\udd47\u0421\u0431\u043e\u0440\u043a\u0430 Android-\u043f\u0440\u043e\u0435\u043a\u0442\u0430 \u0432 Docker-\u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0435 | ProHoster\" \/>\n\t\t<meta property=\"og:description\" content=\"\u0420\u0430\u0437\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u044f \u043f\u0440\u043e\u0435\u043a\u0442 \u043f\u043e\u0434 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0443 Android, \u0434\u0430\u0436\u0435 \u0441\u0430\u043c\u044b\u0439 \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u043e\u0439, \u0440\u0430\u043d\u043e \u0438\u043b\u0438 \u043f\u043e\u0437\u0434\u043d\u043e \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0441\u0442\u0430\u043b\u043a\u0438\u0432\u0430\u0442\u044c\u0441\u044f \u0441 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u0435\u043c \u0434\u043b\u044f \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438.\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/da\/blog\/administrirovanie\/sborka-android-proekta-v-docker-kontejnere\" \/>\n\t\t<meta property=\"og:image\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:secure_url\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:width\" content=\"350\" \/>\n\t\t<meta property=\"og:image:height\" content=\"350\" \/>\n\t\t<meta property=\"article:published_time\" content=\"2019-10-31T19:18:20+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2019-10-31T19:18:20+00:00\" \/>\n\t\t<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<meta property=\"article:author\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<!-- All in One SEO -->\n\n","aioseo_head_json":{"title":"\ud83e\udd47Opbygning af Android-projekt i Docker-container | ProHoster","description":"N\u00e5r man udvikler et projekt til Android-platformen, uanset hvor lille det er, st\u00f8der man f\u00f8r eller senere p\u00e5 udviklingsmilj\u00f8et.","canonical_url":"https:\/\/prohoster.info\/da\/blog\/administrirovanie\/sborka-android-proekta-v-docker-kontejnere","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"da_DK","og:site_name":"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b","og:type":"article","og:title":"\ud83e\udd47\u0421\u0431\u043e\u0440\u043a\u0430 Android-\u043f\u0440\u043e\u0435\u043a\u0442\u0430 \u0432 Docker-\u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0435 | ProHoster","og:description":"\u0420\u0430\u0437\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u044f \u043f\u0440\u043e\u0435\u043a\u0442 \u043f\u043e\u0434 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0443 Android, \u0434\u0430\u0436\u0435 \u0441\u0430\u043c\u044b\u0439 \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u043e\u0439, \u0440\u0430\u043d\u043e \u0438\u043b\u0438 \u043f\u043e\u0437\u0434\u043d\u043e \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0441\u0442\u0430\u043b\u043a\u0438\u0432\u0430\u0442\u044c\u0441\u044f \u0441 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u0435\u043c \u0434\u043b\u044f \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438.","og:url":"https:\/\/prohoster.info\/da\/blog\/administrirovanie\/sborka-android-proekta-v-docker-kontejnere","og:image":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:secure_url":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:width":350,"og:image:height":350,"article:published_time":"2019-10-31T19:18:20+00:00","article:modified_time":"2019-10-31T19:18:20+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"37565","title":null,"description":null,"keywords":null,"keyphrases":null,"primary_term":null,"canonical_url":null,"og_title":null,"og_description":null,"og_object_type":"default","og_image_type":"default","og_image_url":null,"og_image_width":null,"og_image_height":null,"og_image_custom_url":null,"og_image_custom_fields":null,"og_video":null,"og_custom_url":null,"og_article_section":null,"og_article_tags":null,"twitter_use_og":false,"twitter_card":"default","twitter_image_type":"default","twitter_image_url":null,"twitter_image_custom_url":null,"twitter_image_custom_fields":null,"twitter_title":null,"twitter_description":null,"schema":{"blockGraphs":[],"customGraphs":[],"default":{"data":{"Article":[],"Course":[],"Dataset":[],"FAQPage":[],"Movie":[],"Person":[],"Product":[],"ProductReview":[],"Car":[],"Recipe":[],"Service":[],"SoftwareApplication":[],"WebPage":[]},"graphName":"","isEnabled":true},"graphs":[]},"schema_type":null,"schema_type_options":null,"pillar_content":false,"robots_default":true,"robots_noindex":false,"robots_noarchive":false,"robots_nosnippet":false,"robots_nofollow":false,"robots_noimageindex":false,"robots_noodp":false,"robots_notranslate":false,"robots_max_snippet":null,"robots_max_videopreview":null,"robots_max_imagepreview":"large","priority":null,"frequency":null,"local_seo":null,"seo_analyzer_scan_date":"2026-01-23 18:24:19","breadcrumb_settings":null,"limit_modified_date":false,"reviewed_by":null,"ai":null,"created":"2021-03-01 01:24:24","updated":"2026-01-23 18:24:19","focus_keyword":null,"additional_keywords":null,"truseo_locale":null},"gt_translate_keys":[{"key":"link","format":"url"}],"_links":{"self":[{"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/posts\/37565","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/comments?post=37565"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/posts\/37565\/revisions"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/media?parent=37565"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/categories?post=37565"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/tags?post=37565"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}