{"id":268772,"date":"2015-11-23T13:28:02","date_gmt":"2015-11-23T10:28:02","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=268772"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=268772","title":{"rendered":"\u0413\u043e\u0442\u043e\u0432\u0438\u043c ASP.NET 5: Continuous Deployment \u0441 Docker \u0438 Tutum"},"content":{"rendered":"<p>       \u0412 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u044f \u0440\u0430\u0441\u0441\u043a\u0430\u0436\u0443, \u043a\u0430\u043a \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0435\u043d\u0438\u0435 \u043d\u0435\u043f\u0440\u0435\u0440\u044b\u0432\u043d\u043e\u0433\u043e \u0440\u0430\u0437\u0432\u0435\u0440\u0442\u044b\u0432\u0430\u043d\u0438\u044f (Continuous Deployment) \u0434\u043b\u044f <a href=\"http:\/\/www.asp.net\/vnext\">ASP.NET 5 (Vnext)<\/a> \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u043d\u0430 \u0431\u0430\u0437\u0435 Docker \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430, <a href=\"https:\/\/www.tutum.co\/\">Tutum<\/a>, \u0441\u0435\u0440\u0432\u0435\u0440\u0430 \u0438\u043b\u0438 \u043e\u0431\u043b\u0430\u043a\u0430.<\/p>\n<p>  \u041f\u0440\u0438 \u0438\u0437\u0443\u0447\u0435\u043d\u0438\u0438 \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u043e\u0432 \u043f\u043e Docker \u043d\u0430\u0438\u0431\u043e\u043b\u044c\u0448\u0435\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0432\u043e\u043f\u0440\u043e\u0441\u043e\u0432 \u0443 \u043c\u0435\u043d\u044f \u0432\u044b\u0437\u0432\u0430\u043b\u043e, \u043a\u0430\u043a \u0440\u0430\u0437\u0432\u0435\u0440\u043d\u0443\u0442\u044c \u043c\u043e\u0439 \u043f\u0440\u0438\u0432\u0430\u0442\u043d\u044b\u0439 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0439 \u043d\u0430 \u0441\u0435\u0440\u0432\u0435\u0440 \u0438 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u044d\u0442\u043e \u043f\u0440\u043e\u0446\u0435\u0441\u0441, \u043f\u0440\u0438\u0447\u0435\u043c \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u044d\u0442\u043e \u0445\u043e\u0442\u0435\u043b\u043e\u0441\u044c \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u0440\u0435\u0448\u0435\u043d\u0438\u0435\u043c \u0434\u043b\u044f Azure, \u043d\u043e \u0438\u043c\u0435\u0442\u044c \u0442\u0430\u043a\u0443\u044e \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0434\u043b\u044f <a href=\"https:\/\/www.digitalocean.com\/\">Digital Ocean<\/a> \u0438\u043b\u0438 <a href=\"https:\/\/vscale.io\/\">Vscale<\/a>.<br \/>  <a name=\"habracut\"><\/a>  <\/p>\n<h3>\u0420\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0439<\/h3>\n<p>  \u0421\u043d\u0430\u0447\u0430\u043b\u0430 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u043f\u0440\u0438\u0432\u0430\u0442\u043d\u044b\u0439 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0439 \u043d\u0430 <a href=\"https:\/\/bitbucket.org\/\">Bitbucket<\/a>, \u0442\u0438\u043f \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u044f \u043c\u043e\u0436\u043d\u043e \u0432\u044b\u0431\u0440\u0430\u0442\u044c \u043b\u044e\u0431\u043e\u0439, \u043d\u043e \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0432 \u043f\u0440\u0438\u043c\u0435\u0440\u0435 <b>Git<\/b>, \u043a\u0430\u043a \u043d\u0430\u0438\u0431\u043e\u043b\u0435\u0435 \u043f\u043e\u043f\u0443\u043b\u044f\u0440\u043d\u044b\u0439. \u041c\u043e\u0436\u043d\u043e \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u043f\u0440\u0438\u0432\u0430\u0442\u043d\u044b\u0439 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0439 \u0438 \u043d\u0430 <a href=\"https:\/\/github.com\/\">Github <\/a>(\u043f\u043b\u0430\u0442\u043d\u043e) \u0438 \u043d\u0430 <a href=\"https:\/\/about.gitlab.com\/gitlab-com\/\">GitLab<\/a> (\u0431\u0435\u0441\u043f\u043b\u0430\u0442\u043d\u043e, \u043d\u043e \u043d\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442\u0441\u044f <a href=\"http:\/\/hub.docker.com&quot;\">https:\/\/hub.docker.com<\/a>), \u043d\u043e \u0442\u0430\u043a \u0438\u0441\u0442\u043e\u0440\u0438\u0447\u0435\u0441\u043a\u0438 \u0441\u043b\u043e\u0436\u0438\u043b\u043e\u0441\u044c, \u0447\u0442\u043e \u044f \u0432 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b bitbucket \u0438 mercurial, \u0430 \u0441\u0435\u0439\u0447\u0430\u0441 \u043f\u0435\u0440\u0435\u0445\u043e\u0436\u0443 \u043d\u0430 git.<\/p>\n<p>  \u0414\u043b\u044f \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u0441\u043a\u0430\u0447\u0438\u0432\u0430\u043d\u0438\u044f \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u044f \u0447\u0435\u0440\u0435\u0437 ssh \u0441 \u0434\u043e\u043a\u0435\u0440 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430 \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e <a href=\"https:\/\/confluence.atlassian.com\/bitbucket\/set-up-ssh-for-git-728138079.html\">\u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043a\u043b\u044e\u0447<\/a> \u0432 \u043d\u0430\u0448\u0443 \u0443\u0447\u0435\u0442\u043d\u0443\u044e \u0437\u0430\u043f\u0438\u0441\u044c (manage Account-&gt;SSH Keys-Add key).<\/p>\n<p>  \u0422\u0435\u043f\u0435\u0440\u044c \u043d\u0430\u043c \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u043a\u043b\u043e\u043d\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043d\u0430\u0448 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0439 \u043d\u0430 \u0441\u0432\u043e\u044e \u043c\u0430\u0448\u0438\u043d\u0443-\u044f \u0434\u0435\u043b\u0430\u044e \u044d\u0442\u043e \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e <a href=\"https:\/\/www.sourcetreeapp.com\/\">Source Tree<\/a>, \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0442\u0443\u0434\u0430 \u043d\u043e\u0432\u044b\u0439 \u043f\u0440\u043e\u0435\u043a\u0442 <a href=\"https:\/\/docs.asp.net\/en\/latest\/tutorials\/index.html\">Vnext<\/a>, \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c ssh \u043a\u043b\u044e\u0447 \u0438 Dockerfile.<\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">\u043f\u0440\u043e beta-8, iis \u0438 vs<\/b><\/p>\n<div class=\"spoiler_text\">\u041f\u0440\u0438 \u0440\u0430\u0431\u043e\u0442\u0435 \u0432 vs \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f beta-8 \u043d\u0435\u043b\u044c\u0437\u044f \u0432\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u043f\u0430\u043a\u0435\u0442\u044b \u0438\u0437 \u0441\u0442\u0443\u0434\u0438\u0438 \u043d\u0430\u0434\u043e \u0434\u0435\u043b\u0430\u0442\u044c dnu restore \u0438\u0437 \u043a\u043e\u043d\u0441\u043e\u043b\u0438. IIS \u0443 \u043c\u0435\u043d\u044f \u0442\u0430\u043a \u0438 \u043d\u0435 \u0437\u0430\u0440\u0430\u0431\u043e\u0442\u0430\u043b, \u0435\u0441\u043b\u0438 \u043a\u0442\u043e \u0437\u043d\u0430\u0435\u0442 \u0440\u0435\u0448\u0435\u043d\u0438\u0435-\u0431\u0443\u0434\u0443 \u0440\u0430\u0434.  <\/div>\n<\/div>\n<p>  \u041f\u0440\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0438 Dockerfile \u0434\u043b\u044f \u0440\u0430\u0437\u0432\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u043d\u0438\u044f \u0435\u0441\u0442\u044c \u0434\u0432\u0430 \u043f\u043e\u0434\u0445\u043e\u0434\u0430:<\/p>\n<p>  1) \u0421\u0434\u0435\u043b\u0430\u0442\u044c <b>COPY<\/b> \u2014 \u0442\u043e\u0433\u0434\u0430 Dockerfile \u0434\u043e\u043b\u0436\u0435\u043d \u0431\u044b\u0442\u044c \u0432 root \u043f\u0440\u043e\u0435\u043a\u0442\u0430.<br \/>  2) \u0421\u0434\u0435\u043b\u0430\u0442\u044c <b>git clone<\/b> \u2014 \u0442\u043e\u0433\u0434\u0430 Dockerfile \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0432 \u043b\u044e\u0431\u043e\u043c \u043c\u0435\u0441\u0442\u0435, ssh \u043a\u043b\u044e\u0447 \u043e\u0442 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u044f \u0436\u0435\u043b\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u0440\u044f\u0434\u043e\u043c.<\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">Dockerfile<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"cmake\">FROM microsoft\/aspnet:1.0.0-beta8 #\u0423\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u043c \u0440\u0430\u0431\u043e\u0447\u0443\u044e \u043f\u0430\u043f\u043a\u0443 WORKDIR \/app #\u041e\u0431\u043d\u043e\u0432\u0438\u043c\u0441\u044f \u0438 \u043f\u043e\u0441\u0442\u0430\u0432\u0438\u043c git RUN apt-get update && apt-get install -y git  #\u0414\u043e\u0431\u0430\u0432\u0438\u043c \u043a\u043b\u044e\u0447 RUN mkdir -p \/root\/.ssh ADD yourkey \/root\/.ssh\/id_rsa RUN chmod 700 \/root\/.ssh\/id_rsa RUN echo &quot;Host yourkey &quot;$'\\n'&quot;HostName bitbucket.org&quot;$'\\n'&quot;IdentityFile \/root\/.ssh\/id_rsa&quot; &gt;&gt; \/root\/.ssh\/config  #\u0421\u043e\u0437\u0434\u0430\u0434\u0438\u043c known_hosts RUN touch \/root\/.ssh\/known_hosts #\u0414\u043e\u0431\u0430\u0432\u0438\u043c bitbuckets key RUN ssh-keyscan bitbucket.org &gt;&gt; \/root\/.ssh\/known_hosts #\u043a\u043e\u043f\u0438\u0440\u0443\u0435\u043c \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0439 RUN git clone git@bitbucket.org:login\/repositoryName.git  # \u0434\u043e\u0431\u0430\u0432\u0438\u043c \u0432 \u043d\u0430\u0448 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0443 NuGet - \u0448\u0430\u0433 \u043d\u0435 \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0439 RUN mkdir -p ~\/.config\/NuGet RUN cd repositoryName RUN cp \/app\/repositoryName\/NuGet.config ~\/.config\/NuGet\/ #\u0432\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u043c \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 RUN dnu restore  EXPOSE 5004 #\u0442\u043e\u0447\u043a\u0430 \u0432\u0445\u043e\u0434\u0430 \u0432 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440 ENTRYPOINT [&quot;sh&quot;, &quot;\/app\/repositoryName\/init.sh&quot;] <\/code><\/pre>\n<p>  <\/div>\n<\/div>\n<p>  <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">init.sh<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"bash\">cd \/app\/repositoryName\/ dnx -p project.json kestrel <\/code><\/pre>\n<p>  <\/div>\n<\/div>\n<p>  \u0414\u0435\u043b\u0430\u0435\u043c commit \u0438 push.<\/p>\n<h3>Hub.docker.com<\/h3>\n<p>  \u0423 \u043d\u0430\u0441 \u0435\u0441\u0442\u044c \u043f\u0440\u043e\u0435\u043a\u0442, \u0435\u0441\u0442\u044c \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440, \u0432\u0441\u0435 \u044d\u0442\u043e \u043c\u043e\u0436\u043d\u043e \u043e\u0442\u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c <a href=\"https:\/\/www.docker.com\/products\/overview#\/docker_toolbox\">\u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e<\/a>, \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0430\u044f \u0437\u0430\u0434\u0430\u0447\u0430 \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u0432\u0441\u0435 \u044d\u0442\u043e \u043d\u0430 \u0441\u0435\u0440\u0432\u0435\u0440\u0435, \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438.<\/p>\n<p>  \u0421\u043e\u0437\u0434\u0430\u0435\u043c \u0430\u043a\u043a\u0430\u0443\u043d\u0442 \u0438\u043b\u0438 \u0432\u0445\u043e\u0434\u0438\u043c \u043d\u0430 <a href=\"https:\/\/hub.docker.com\/\">hub.docker.com<\/a>. \u041f\u043e\u0441\u043b\u0435 \u044d\u0442\u043e\u0433\u043e \u043d\u0430\u0434\u043e \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u00abCreate Automated Build\u00bb, \u044d\u0442\u043e \u043c\u043e\u0436\u043d\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0438\u0437 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0435\u0432 Github \u0438\u043b\u0438 Bitbucket.<\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\"  src=\"https:\/\/habrastorage.org\/files\/956\/447\/e10\/956447e1086c482aadd27f0976d5f53a.png\" alt=\"Create Automated Build\"\/><\/div>\n<p>  <i>\u0420\u0438\u0441.1 \u2014 Create Automated Build<\/i><\/p>\n<p>  \u0422\u0435\u043f\u0435\u0440\u044c \u043d\u0430\u043c \u043d\u0430\u0434\u043e \u043d\u0430\u0441\u0442\u0440\u043e\u0438\u0442\u044c \u0441\u0431\u043e\u0440\u043a\u0443.<\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\"  src=\"https:\/\/habrastorage.org\/files\/8a8\/337\/b4f\/8a8337b4fb4242a3b2866db5d5e0e199.png\" alt=\"Build Settings \u043c\u043e\u0435\u0433\u043e \u043f\u0440\u043e\u0435\u043a\u0442\u0430\"\/><\/div>\n<p>  <i>\u0420\u0438\u0441.2 \u2014 Build Settings \u043c\u043e\u0435\u0433\u043e \u043f\u0440\u043e\u0435\u043a\u0442\u0430<\/i><\/p>\n<p>  <b>When active, builds will happen automatically on pushes.<\/b> -\u0435\u0441\u043b\u0438 \u043e\u0442\u043c\u0435\u0447\u0435\u043d\u0430 \u0433\u0430\u043b\u043e\u0447\u043a\u043e\u0439 \u2014 \u043f\u0440\u0438 push \u0432 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0439 \u0432 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u0438 \u0441 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430\u043c\u0438 \u0431\u0443\u0434\u0435\u0442 \u0437\u0430\u043f\u0443\u0449\u0435\u043d\u0430 \u0441\u0431\u043e\u0440\u043a\u0430 \u043d\u043e\u0432\u043e\u0433\u043e \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430.<br \/>  <b>Name<\/b> \u2014 \u0432\u0435\u0442\u043a\u0430 \u0438\u0437 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u0441\u043e\u0431\u0438\u0440\u0430\u0442\u044c \u043f\u0440\u043e\u0435\u043a\u0442, \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u0441\u043e\u0431\u0438\u0440\u0430\u0435\u0442 \u0432\u0441\u0435 \u0432\u0435\u0442\u043a\u0438.<br \/>  <b>Dockerfile Location<\/b> \u2014 \u043f\u0430\u043f\u043a\u0430 \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u043b\u0435\u0436\u0438\u0442 Dockerfile, \u0438\u043c\u0435\u043d\u043d\u043e \u043f\u0430\u043f\u043a\u0430, \u043d\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0442\u044c \u0441\u0432\u043e\u0435 \u0438\u043c\u044f Dockerfile. \u0418\u043c\u0435\u043d\u043d\u043e \u043f\u043e \u044d\u0442\u043e\u0439 \u043f\u0440\u0438\u0447\u0438\u043d\u0435 \u0443\u0434\u043e\u0431\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u043a\u043e\u0434\u0430 \u0447\u0435\u0440\u0435\u0437 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0439, \u0430 \u043d\u0435 \u0447\u0435\u0440\u0435\u0437 \u043a\u043e\u043c\u0430\u043d\u0434\u0443 COPY. \u041d\u0430 \u043e\u0434\u043d\u043e\u043c \u043f\u0440\u0438\u0432\u0430\u0442\u043d\u043e\u043c \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0438 \u043c\u043e\u0436\u043d\u043e \u0441\u043e\u0431\u0438\u0440\u0430\u0442\u044c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043f\u0440\u043e\u0435\u043a\u0442\u043e\u0432 \u0438\u043c\u0435\u044e\u0449\u0438\u0445 \u043e\u0431\u0449\u0443\u044e \u043a\u043e\u0434\u043e\u0432\u0443\u044e \u0431\u0430\u0437\u0443, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, api \u0438 \u0432\u043e\u0440\u043a\u0435\u0440\u043e\u0432 \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u044e\u0449\u0438\u0445 \u0434\u043e\u043b\u0433\u0438\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438.<br \/>  <b>Docker Tag Name<\/b> \u2014 \u0442\u044d\u0433 \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u043e\u0442\u043e\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0434\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u043e\u0433\u043e \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430.<br \/>  \u0415\u0441\u043b\u0438 \u0432\u044b\u0431\u0440\u0430\u043d\u0430 \u0441\u0431\u043e\u0440\u043a\u0430 \u0434\u043b\u044f \u0432\u0441\u0435\u0445 \u0432\u0435\u0442\u043e\u043a \u0442\u043e \u043a\u043d\u043e\u043f\u043a\u0430 Trigger \u043d\u0435 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u0430 \u0438 \u043d\u0430\u043c \u043d\u0430\u0434\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c push \u0434\u043b\u044f \u0441\u0431\u043e\u0440\u043a\u0438.<br \/>  \u0421\u043c\u043e\u0442\u0440\u0438\u043c \u0432 <b>Build Details<\/b> \u0441\u0442\u0430\u0442\u0443\u0441\u044b \u0438 \u043b\u043e\u0433 \u0441\u0431\u043e\u0440\u043a\u0438, \u0435\u0441\u043b\u0438 \u0432\u0441\u0435 \u0441\u043e\u0431\u0440\u0430\u043b\u043e\u0441\u044c \u043c\u043e\u0436\u0435\u043c \u043f\u0440\u0438\u0441\u0442\u0443\u043f\u0430\u0442\u044c \u043a \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u043c\u0443 \u0448\u0430\u0433\u0443.<\/p>\n<h3>Tutum<\/h3>\n<p>  <a href=\"https:\/\/dashboard.tutum.co\/accounts\/login\/\">\u0417\u0430\u0445\u043e\u0434\u0438\u043c<\/a> \u0447\u0435\u0440\u0435\u0437 docker hub \u043d\u0430 Tutum.<\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\"  src=\"https:\/\/habrastorage.org\/files\/a28\/d7b\/764\/a28d7b764f48424492531db27b12d403.png\" alt=\"\u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0439 \u043d\u0430 Tutum\"\/><\/div>\n<p>  <i>\u0420\u0438\u0441.3 \u2014 \u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0439 \u043d\u0430 Tutum, \u0434\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432<\/i><\/p>\n<p>  <b>Repository name<\/b> \u2014 \u043b\u043e\u0433\u0438\u043d\/\u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0439 \u043d\u0430 hub.docker.com<br \/>  <b>Username<\/b> \u0438 <b>Password<\/b> \u043e\u0442 <b>hub.docker.com<\/b><\/p>\n<p>  \u0422\u0435\u043f\u0435\u0440\u044c \u043d\u0430\u0441\u0442\u0440\u043e\u0438\u043c Cloud Providers \u0447\u0442\u043e\u0431\u044b \u0438\u043c\u0435\u0442\u044c \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u0441\u0435\u0440\u0432\u0435\u0440\u0430 \u0438\u0437 \u043f\u0430\u043d\u0435\u043b\u0438 Tutum.<\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\"  src=\"https:\/\/habrastorage.org\/files\/b7e\/a89\/3d9\/b7ea893d93014f3e81b1ce24fb9f3976.png\" alt=\"Account info\"\/><\/div>\n<p>  <i>\u0420\u0438\u0441.4 \u2014 \u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u0441\u0441\u044b\u043b\u043a\u0438 \u043d\u0430 \u043d\u0443\u0436\u043d\u044b\u0435 \u043e\u0431\u043b\u0430\u0447\u043d\u044b\u0435 \u0441\u0435\u0440\u0432\u0438\u0441\u044b<\/i><\/p>\n<p>  \u0421\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u0441\u0435\u0440\u0432\u0435\u0440(node) \u0434\u043b\u044f \u043f\u0443\u0431\u043b\u0438\u043a\u0430\u0446\u0438\u0438 \u043d\u0430\u0448\u0438\u0445 \u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432.<\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\"  src=\"https:\/\/habrastorage.org\/files\/c34\/38e\/9d5\/c3438e9d5db64adbbd8565143b9a96c7.png\" alt=\"Create a node cluster\"\/><\/div>\n<p>  <i>\u0420\u0438\u0441.5 \u2014 \u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u0441\u0435\u0440\u0432\u0435\u0440 \u0438 \u0435\u0433\u043e \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b, \u0432 \u0434\u0430\u043d\u043d\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u044d\u0442\u043e DO<\/i><\/p>\n<p>  <b>Deploy tags<\/b> \u2014 tag \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0432\u044b \u043f\u0438\u0448\u0438\u0442\u0435 \u0432 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u0441\u0435\u0440\u0432\u0435\u0440\u0430, \u0447\u0442\u043e\u0431\u044b \u0441\u043e\u043e\u0442\u043d\u0435\u0441\u0442\u0438 \u0441\u0435\u0440\u0432\u0438\u0441\u044b \u0438 \u043c\u0430\u0448\u0438\u043d\u044b \u043d\u0430 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u043e\u043d\u0438 \u0440\u0430\u0437\u0432\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u044e\u0442\u0441\u044f.  <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">Vscale.io<\/b><\/p>\n<div class=\"spoiler_text\">\u041a\u0430\u043a \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043c\u0430\u0448\u0438\u043d\u0443 <a href=\"https:\/\/vscale.io\/\">Vscale.io<\/a>:<br \/>  \u041d\u0430\u0436\u0438\u043c\u0430\u0435\u043c \u043d\u0430 <b>Bring your own node<\/b> \u2014 \u043d\u0430\u043c \u0434\u0430\u044e\u0442 \u043a\u043e\u043c\u0430\u043d\u0434\u0443 \u0432\u0438\u0434\u0430:<br \/>  <i>curl -Ls <a href=\"https:\/\/get.tutum.co\/\">get.tutum.co<\/a> | sudo -H sh -s b5730f134e5f4674575c45a65a0ddd84<\/i><\/p>\n<p>  \u0415\u0435 \u043d\u0430\u0434\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c, \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u0432\u0448\u0438\u0441\u044c \u043d\u0430 \u043d\u0430\u0448 vscale.io \u0441\u0435\u0440\u0432\u0435\u0440 \u043f\u043e ssh.  <\/div>\n<\/div>\n<p>  \u0421\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u043d\u043e\u0432\u044b\u0439 <a href=\"https:\/\/dashboard.tutum.co\/container\/launch\/#tab-image-privates\">Service<\/a><\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\"  src=\"https:\/\/habrastorage.org\/files\/533\/b58\/a65\/533b58a6507f4cf3ba35edf31febf215.png\" alt=\"image\"\/><\/div>\n<p>  <i>\u0420\u0438\u0441.6 \u2014 \u0421\u043e\u0437\u0434\u0430\u0435\u043c Service \u043d\u0430 Tutum<\/i><\/p>\n<p>  <b>Image tag<\/b> \u2014 tag \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0432\u044b \u043d\u0430\u0437\u043d\u0430\u0447\u0438\u043b\u0438 \u0432 hub.docker.com, \u0435\u0441\u043b\u0438 \u043d\u0435\u0442 tag&#8217;\u043e\u0432 \u2014 \u0437\u043d\u0430\u0447\u0438\u0442 \u0432\u044b \u0441\u043a\u043e\u0440\u0435\u0435 \u0432\u0441\u0435\u0433\u043e \u043d\u0435\u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e \u0432\u0432\u0435\u043b\u0438 login\\password \u043f\u0440\u0438 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0438 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u044f.<br \/>  <b>Deploy tags<\/b> \u2014 tag \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0432\u044b \u043f\u0438\u0448\u0438\u0442\u0435 \u0432 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u0441\u0435\u0440\u0432\u0435\u0440\u0430, \u0447\u0442\u043e\u0431\u044b \u0441\u043e\u043e\u0442\u043d\u0435\u0441\u0442\u0438 \u0441\u0435\u0440\u0432\u0438\u0441\u044b \u0438 \u043c\u0430\u0448\u0438\u043d\u044b \u043d\u0430 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u043e\u043d\u0438 \u0440\u0430\u0437\u0432\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u044e\u0442\u0441\u044f.<br \/>  <b>Ports<\/b> \u2014 \u043d\u0443\u0436\u043d\u044b \u0441\u0434\u0435\u043b\u0430\u0442\u044c <b>Published<\/b> \u043d\u0430\u0448 \u043f\u043e\u0440\u0442 5004 \u0438 \u043d\u0430\u0437\u043d\u0430\u0447\u0438\u0442\u044c \u043d\u0430 \u043d\u0435\u0433\u043e 80-\u044b\u0439 \u043f\u043e\u0440\u0442.<br \/>  \u041d\u0430\u0436\u0438\u043c\u0430\u0435\u043c <b>create and deploy<\/b><\/p>\n<p>  \u0421\u0435\u0440\u0432\u0438\u0441\u044b \u043c\u043e\u0436\u043d\u043e \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0447\u0435\u0440\u0435\u0437 Stack \u0444\u0430\u0439\u043b \u2014 \u043e\u0447\u0435\u043d\u044c \u0443\u0434\u043e\u0431\u043d\u0430\u044f \u0432\u0435\u0449\u044c, \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043e\u0445\u0432\u0430\u0442\u0438\u0442\u044c \u0432\u0437\u0433\u043b\u044f\u0434\u043e\u043c \u0441\u0440\u0430\u0437\u0443 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432 \u0438 \u0431\u044b\u0441\u0442\u0440\u043e \u043f\u0440\u0430\u0432\u0438\u0442\u044c \u0438\u0445 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b, \u0443 \u043c\u0435\u043d\u044f \u0441\u0435\u0439\u0447\u0430\u0441 10 \u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432 \u0438 \u044d\u0442\u043e \u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0430\u0447\u0430\u043b\u043e, \u043a\u0430\u043a \u043c\u0438\u043d\u0438\u043c\u0443\u043c \u044f \u0434\u043e\u0431\u0430\u0432\u043b\u044e \u0435\u0449\u0435 3 \u0441\u0435\u0440\u0432\u0438\u0441\u0430\u2026<\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">Stack \u0444\u0430\u0439\u043b<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code>asp: image: 'login\/reponame:tag' ports: - '80:5004' restart: always tags: - tagdeploy <\/code><\/pre>\n<p>  <\/div>\n<\/div>\n<p>  \u0422\u0435\u043f\u0435\u0440\u044c \u043c\u044b \u0441\u043e\u0437\u0434\u0430\u043b\u0438 \u0438 \u0440\u0430\u0437\u0432\u0435\u0440\u043d\u0443\u043b\u0438 \u0441\u0435\u0440\u0432\u0438\u0441 \u043d\u0430 \u043d\u0430\u0448 \u0441\u0435\u0440\u0432\u0435\u0440, \u043f\u043e \u0430\u0434\u0440\u0435\u0441\u0443 \u0443\u043a\u0430\u0437\u0430\u043d\u043e\u043c\u0443 \u0432 <b>Endpoints<\/b> \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u043d\u0430\u0448 \u0441\u0430\u0439\u0442.<br \/>  \u041e\u0441\u0442\u0430\u043b\u043e\u0441\u044c \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u043c\u0430\u0433\u0438\u0438 \u2014 \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u0441\u043b\u0435 \u0441\u0431\u043e\u0440\u043a\u0438 \u043d\u043e\u0432\u043e\u0433\u043e \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430 \u0443 \u043d\u0430\u0441 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u043b \u0435\u0433\u043e \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0439 <b>redeploy<\/b>.<\/p>\n<p>  \u0417\u0430\u0445\u043e\u0434\u0438\u043c \u0432 \u043d\u0430\u0448 \u0441\u0435\u0440\u0432\u0438\u0441 \u0438 \u0432\u044b\u0431\u0438\u0440\u0430\u0435\u043c \u0432\u043a\u043b\u0430\u0434\u043a\u0443 <b>Triggers<\/b>.<\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\"  src=\"https:\/\/habrastorage.org\/files\/a04\/ced\/7b2\/a04ced7b24f146ce9ad6cb7506a6803e.png\" alt=\"Add trigger\"\/><\/div>\n<p>  <i>\u0420\u0438\u0441.7 \u2014 Webhook \u0434\u043b\u044f redeploy \u043d\u0430 Tutum<\/i><\/p>\n<p>  \u041f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u044b\u0439 url \u043d\u0430\u043c \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0432 docker hub \u0434\u043b\u044f \u043d\u0430\u0448\u0435\u0433\u043e \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u044f.<\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\"  src=\"https:\/\/habrastorage.org\/files\/150\/fa2\/495\/150fa249501f44ef967b1dc3680196fa.png\" alt=\"Add webhook\"\/><\/div>\n<p>  <i>\u0420\u0438\u0441.8 \u2014 \u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c Webhook \u0438\u0437 Tutum<\/i><\/p>\n<p>  \u041f\u043e\u0437\u0434\u0440\u0430\u0432\u043b\u044f\u044e \u2014 \u0432\u0441\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0438 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0431\u0443\u0434\u0435\u0442 \u0440\u0430\u0437\u0432\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u0442\u044c\u0441\u044f.       <\/p>\n<div class=\"clear\"><\/div>\n<p> \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"http:\/\/habrahabr.ru\/post\/271477\/\"> http:\/\/habrahabr.ru\/post\/271477\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>       \u0412 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u044f \u0440\u0430\u0441\u0441\u043a\u0430\u0436\u0443, \u043a\u0430\u043a \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0435\u043d\u0438\u0435 \u043d\u0435\u043f\u0440\u0435\u0440\u044b\u0432\u043d\u043e\u0433\u043e \u0440\u0430\u0437\u0432\u0435\u0440\u0442\u044b\u0432\u0430\u043d\u0438\u044f (Continuous Deployment) \u0434\u043b\u044f <a href=\"http:\/\/www.asp.net\/vnext\">ASP.NET 5 (Vnext)<\/a> \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u043d\u0430 \u0431\u0430\u0437\u0435 Docker \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430, <a href=\"https:\/\/www.tutum.co\/\">Tutum<\/a>, \u0441\u0435\u0440\u0432\u0435\u0440\u0430 \u0438\u043b\u0438 \u043e\u0431\u043b\u0430\u043a\u0430.<\/p>\n<p>  \u041f\u0440\u0438 \u0438\u0437\u0443\u0447\u0435\u043d\u0438\u0438 \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u043e\u0432 \u043f\u043e Docker \u043d\u0430\u0438\u0431\u043e\u043b\u044c\u0448\u0435\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0432\u043e\u043f\u0440\u043e\u0441\u043e\u0432 \u0443 \u043c\u0435\u043d\u044f \u0432\u044b\u0437\u0432\u0430\u043b\u043e, \u043a\u0430\u043a \u0440\u0430\u0437\u0432\u0435\u0440\u043d\u0443\u0442\u044c \u043c\u043e\u0439 \u043f\u0440\u0438\u0432\u0430\u0442\u043d\u044b\u0439 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0439 \u043d\u0430 \u0441\u0435\u0440\u0432\u0435\u0440 \u0438 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u044d\u0442\u043e \u043f\u0440\u043e\u0446\u0435\u0441\u0441, \u043f\u0440\u0438\u0447\u0435\u043c \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u044d\u0442\u043e \u0445\u043e\u0442\u0435\u043b\u043e\u0441\u044c \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u0440\u0435\u0448\u0435\u043d\u0438\u0435\u043c \u0434\u043b\u044f Azure, \u043d\u043e \u0438\u043c\u0435\u0442\u044c \u0442\u0430\u043a\u0443\u044e \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0434\u043b\u044f <a href=\"https:\/\/www.digitalocean.com\/\">Digital Ocean<\/a> \u0438\u043b\u0438 <a href=\"https:\/\/vscale.io\/\">Vscale<\/a>.  <\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-268772","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/268772","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=268772"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/268772\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=268772"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=268772"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=268772"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}