From efa461f83bed41cde6d504ffeedb842e5c5a45e8 Mon Sep 17 00:00:00 2001 From: Anca Iordache Date: Fri, 6 Mar 2020 15:04:03 +0100 Subject: [PATCH 1/6] update README.md Signed-off-by: Anca Iordache --- README.md | 44 ++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 40 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index c2a7716..6058481 100644 --- a/README.md +++ b/README.md @@ -2,15 +2,51 @@ ![logo](awesome-compose.jpg) -> A curated list of Compose files +> A curated list of docker-compose application samples. +The purpose of these samples is to provide a quick start on how to integrate different services with a Compose file and to quickly manage their deployment with docker-compose. -Compose files are used to define container-based application and deploy them. + +## Getting Started + +These instructions will get you through the bootstrap phase of creating and deploying samples of containerized applications with docker-compose. + + +### Prerequisites + +Make sure you have docker and docker-compose installed. Download all or any of the samples in the `samples` directory. + +### Running a sample + +The root directory of each sample contains the docker-compose.yaml describing the configuration of service components. All samples can be run in local environment by going into the root directory of each one and doing: +``` +docker-compose up -d +``` +Check the `README.md` of each sample to get more details on the structure and what is the expected output. +To stop and remove the running containers of the sample application do: +``` +docker-compose down +``` ## Contents -- [List item](http://example.com) -- [List item](http://example.com) +*Samples of docker-compose applications with multiple integrated services:* + +- [`Asp.NET/MS-SQL`](samples/aspnet-mysql/README.md) -- sample asp\\.net core application with MySQL database +- [`Flask / NGINX / MySQL`](samples/nginx-flask-mysql/README.md) -- sample Python/Flask application with an Nginx proxy and a MySQL database +- [`Go / NGINX / MySQL`](samples/nginx-golang-mysql/README.md) -- sample Go application with an Nginx proxy and a MySQL database +- [`Go / NGINX / PostgreSQL`](samples/nginx-golang-postgres/README.md) -- sample Go application with an Nginx proxy and a PostgreSQL database +- [`Java / MySQL`](samples/sparkjava-mysql/README.md) -- sample Java application and a MySQL database +- [`NGINX / Go`](samples/nginx-gohttp_1/README.md) -- sample Nginx application with a Go backend +- [`NGINX / Go`](samples/nginx-gohttp_2/README.md) -- another Nginx sample application with a Go backend +- [`React / Spring / MySQL`](samples/react-java-mysql/README.md) -- sample React application with a Spring backend and a MySQL database +- [`React / Express / MySQL`](samples/react-express-mysql/README.md) -- sample React application with a NodeJS backend and a MySQL database +- [`Spring / PostgreSQL`](samples/spring-postgres/README.md) -- sample Java application with Spring framework and a Postgres database + + +*Single service samples:* +- [`Angular`](samples/angular/README.md) +- [`VueJS`](samples/vuejs/README.md) ## Contribute From 88b5df7844e753b30d764d7ec80e02a77b8992bc Mon Sep 17 00:00:00 2001 From: Anca Iordache Date: Fri, 6 Mar 2020 16:36:03 +0100 Subject: [PATCH 2/6] update angular sample Signed-off-by: Anca Iordache --- samples/angular/README.md | 70 ++++++++++++++++++++++++ samples/angular/angular/src/favicon.ico | Bin 948 -> 3542 bytes samples/angular/docker-compose.yaml | 2 +- samples/angular/output.jpg | Bin 0 -> 39789 bytes 4 files changed, 71 insertions(+), 1 deletion(-) create mode 100644 samples/angular/README.md create mode 100644 samples/angular/output.jpg diff --git a/samples/angular/README.md b/samples/angular/README.md new file mode 100644 index 0000000..f1710e3 --- /dev/null +++ b/samples/angular/README.md @@ -0,0 +1,70 @@ +## Compose sample - Angular service + +Project structure: +``` +. +├── angular +│   ├── Dockerfile +│   ├── ... +│   ├── ... +│   .... +│   +├── docker-compose.yaml +└── README.md + +``` + +_docker-compose.yaml_ +``` +version: "3.7" +services: + angular: + build: angular + ports: + - 80:4200 + ... + +``` +The compose file defines an application with one service `angular`. The image for the service is built with the Dockerfile inside the `angular` directory (build parameter). + +When deploying the application, docker-compose maps the container port 4200 to port 80 of the host as specified in the file. +Make sure port 80 is not being used by another container, otherwise the port should be changed. + + +## Deploy with docker-compose + +``` +$ docker-compose up -d +Creating network "angular_default" with the default driver +Building angular +Step 1/7 : FROM node:10 +10: Pulling from library/node +c0c53f743a40: Pull complete +... +... +Successfully built efea5cef6851 +Successfully tagged angular_web:latest +WARNING: Image for service web was built because it did not already exist. To rebuild this image you must use `docker-compose build` or `docker-compose up --build`. +Creating angular_web_1 ... done +``` + + +## Expected result + +Listing containers must show a container running and the port mapping as below: +``` +$ docker ps +CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES +6884c228388e angular_web "docker-entrypoint.s…" 42 seconds ago Up 36 seconds 0.0.0.0:80->4200/tcp angular_web_1 + +``` + +Open a browser and go to localhost. + +![page](http://output.jpg) + +Stop and remove the container + +``` +$ docker-compose down +``` \ No newline at end of file diff --git a/samples/angular/angular/src/favicon.ico b/samples/angular/angular/src/favicon.ico index 997406ad22c29aae95893fb3d666c30258a09537..523925f7bd7c93c1e9f3acf1242ca4b65c3e448f 100644 GIT binary patch literal 3542 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 QF#rGn07*qoM6N<$f-gE^#{d8T literal 948 zcmV;l155mgP)CBYU7IjCFmI-B}4sMJt3^s9NVg!P0 z6hDQy(L`XWMkB@zOLgN$4KYz;j0zZxq9KKdpZE#5@k0crP^5f9KO};h)ZDQ%ybhht z%t9#h|nu0K(bJ ztIkhEr!*UyrZWQ1k2+YkGqDi8Z<|mIN&$kzpKl{cNP=OQzXHz>vn+c)F)zO|Bou>E z2|-d_=qY#Y+yOu1a}XI?cU}%04)zz%anD(XZC{#~WreV!a$7k2Ug`?&CUEc0EtrkZ zL49MB)h!_K{H(*l_93D5tO0;BUnvYlo+;yss%n^&qjt6fZOa+}+FDO(~2>G z2dx@=JZ?DHP^;b7*Y1as5^uphBsh*s*z&MBd?e@I>-9kU>63PjP&^#5YTOb&x^6Cf z?674rmSHB5Fk!{Gv7rv!?qX#ei_L(XtwVqLX3L}$MI|kJ*w(rhx~tc&L&xP#?cQow zX_|gx$wMr3pRZIIr_;;O|8fAjd;1`nOeu5K(pCu7>^3E&D2OBBq?sYa(%S?GwG&_0-s%_v$L@R!5H_fc)lOb9ZoOO#p`Nn`KU z3LTTBtjwo`7(HA6 z7gmO$yTR!5L>Bsg!X8616{JUngg_@&85%>W=mChTR;x4`P=?PJ~oPuy5 zU-L`C@_!34D21{fD~Y8NVnR3t;aqZI3fIhmgmx}$oc-dKDC6Ap$Gy>a!`A*x2L1v0 WcZ@i?LyX}70000w0Ez?v(+rQX{-xPJS0I_1Ihz0g7zs!%Wa8lD0>XwM%<1mp z@Q71D7}Lbk$P|PtK$zYMltB<)c$6Fe#7B?V;s*u?K>*W9O+^$`HcSvEvG@x%{tGs- zbg~24u!C$UOzrGJ@xirzV$(Ji)7x`OidBR!T7(ac_56+|gOKSDqfkOt%dC4dAl z23!Fvz!q=;7(mn>Byk2*KzfmX;gA2rUkT)84Dzx9Oh6uDzze_*F#6#SJhlPI29*A+ zTW51N)*m7;L=gahT6=i-N(lfk2>@^x`|xm+`|xm=2LKQ&0MKdwr~iu_0O0-xlE?lj zqsRsTlpp|T?EO<_oD2Z(LI41F(ZR^c=*NB_KwEHga{xFi1^^^&0Kk|40C?S>^#;;C z>Vf=u08j(fmE0Hrq^1D?l?5oa-oGd}EXd)Hdi$T+{Hni)Wk3{w00)2kf)XU?3k3@W z1qlfS4+8@YiwKX1hyag(fP{>WiiC`YjDUcOjf#eWiG_uQh=PNQjfsnniG}$X1PlV? z0|^BO1qFwRgn)$kA5IV502(aV1-KRj7#aYM1_pr!_RtGF0d;&ZsK-(FM}hzYhlGNL zfrSI92|)^Qh`*`9z(GX-sUMaALd0`cww9a{bJ5HJX$FS?2N#aX^r-ze2?~ME(Lc%ADkgXD__pIb2EZE4 zu=;!Gzxtr)pJvq!zRykwd2@L20Px<-bEOjveCkLu8_Qol<86tm^sv+2z{;0?_s?U% zvj*B^FgYh5$ek|g-HOb1+a zbe5wI&iwwGi$Cz^t0x8u>u&cx7g-W~nzL;d6=&HN+x<)s`)`)EO~1X0{loGf0g48w zATX69|0w?p|3owE`1&JL(H|lnIqzt4;@m}r;{4sSMYhmC6h8sjNT$$l5!l!J>Zvw1 zgZ)GpVS9^-_YXkO_VG#Q4>eQ8H4aXt(r;73=9%9RSg(D_6wlti$Vcp+F#eKJkzq`; zdPko>y}I!JIRG!GLGk+sb|E-&AHxBff_|nygMe9~;jO22$ecd$&GXi6KCPA<+i6=y zDLbk3%{x{5;_?6(-kQlCUZY?%yovrkx5z#;{$k(d_Bc4iUDhbjB>m&$nzij%41LYe zK>E;orZk8n-{d%rf9;&J}nvXMbG5Iqg;5gWW8r7uPw0KtpTG1+JJN4MF<7hYdN z3T|Mw*tamICZ971#nX#917Ha;RGe~#-Z5tnK>iqLrudm)7+rq?NHNMBz{+a+@=)^l z?#(5CCEv5cOCtA}8TZu}85cf18$Zp^#ovGLzaGgG`pE)+RJ)cCXl5Rw;NL#E_6A09d>fn5m-R^Q?YXH;q{c!pTgMN7bJR zS?}PHfhuCL1OU@`5QK>17KO~AVqle0NI9?h(-QdA5E73Egh9~E3jj6s1N4kEX1JYA zqkpmcm1|NG(70yd1|ZT{<$5qPYC?xNOn0rUq9trcom6#fBSpGLt(!bIl%?TUY z37WItfU=@enDbMMlk}5<2MYnfkNwv8wfz!pPW%K2zeW$3CO1_BQzb@YJYHGHC9 zE-h}^f;(T(&@joKxKPca1mIgM~Moo1~sK788%JRT@Rk7EkA*KB8i zBIbSw5yIs(X4^#^hblbbGBweY91KzMZ#Y{PYi#UFpmzMwh*VzU`Sjy{MqPR*URU!G zhtlZ1+eJ8teSAJEb0w9CEw!r}iJVkNFW20SOVibAGD!qDbFC4&b|( z_U$US{>2(pIl`idAOTLQ&`&X8=@@>Gu?q~W?HJw!f#}39@ed`a5k($(!~mrq{NqMK z>JJD4pl*&R^4PX!pu;=>ASiNiQ3;oEnUiK&$wq~d7IXDyET%banHmx#WU!4b{wf^E zlE=A-1w_D9nIHWC02Q>{007u9VO&rz{gq%CT_{LExGe)zG4MZyO+Q0G2@Cz;aRQUM z3Jc*ne=usLps@x@2oXX*sGd^J4+y>8Xl9k24v0>#nZu^ z&mJ_&ET?L$wwk)$RF9T%I+dYJnqiofYEJ5y;bPd7E1JaxT|Y~ps;46cp9wb>pI&Dz zr?xY;K%)Q_ZHk?gjGahE1;k=K)d7n%#ZEDoR@r3T3@Q|Mw1j4f*OE|c>t~f3LUg9b z!K5+4ql68E9ZpWdq@<_Od;T+u3}|c?3W0vIKePS(akU7NZNC0VgLV}3R{cQO4CitC zPZE!_8%PS4_;c8UPyMV@9P~d;k^df{CK5FP7qVA;SGbxjR3;uLIT_vW593E$9UY}y zmCel}X_6me1lX=|f;u(p$UtL6Ck)I{8ViDe&EI{3oRon^PfE@i`lvp%1~eatGN=4- zf(kPHK^cF{X&@NXLk0kPR#6*xLZIS(HT>C=FzF#B9y1KtFYM^>!vSC(Rq+D=_M-hq z_PMQW=OYEgY{DOj+6U@K0szpY!JsV?ZObD=B;eFr@N-9~KjtAYNA5>C0QaFlj@1tY zrqXjjTd=Rf<>Cq~yqzHYw*<2iYzPuSC$2tp>jM zesdOxfE98Hfe6GVMl7#$JfAbr*2gxEdnDHlKB2UsD9obp*XV*0ktZPIUnL<%&9XF4 z+35uZNizZvw_tNXy5Gqs3U3{R@l{&_{%XWWmKE8g_u5XQ=u56QOuu1j$lzi_qx#S{M*b!f^1W(NyMXqa z-IU#Y-FKab7cW<{s5NW*OLKenJ#Ga8XWiNao;18wME7P3%9j3?@k&rf?bjZ_DmjII zLy=>R`wqny7W*Ex$%J;L*%%XjK?5nSdrec3cS?g*iaaytYp>t!ZZ@LD>1QdT~T1ttfMj}&&5^D8{XgHV@kd%GDdL*b9pLPCr z`$fS4AojNi%+v5UM8bG{pSBh{}S_W@*fQNH0UgY4HeXjK<5?E(2u7gKjc5oGSD%wq0xj; zF>#n#*kQ0pNZFKF$;df{4MiwGCm*mNOE4&K?>v<4o4@C_LGmXm`To7ab`&K4GU z2f7q@Q;XYM=dw0anO-}BCmmeIeFtyKlWw?a$4ps)yJ)k6r(@(U&LE^c@_G`T zEGkEued&XF!3RBPOF&v<8{GAl;Qw@}sdPv8OuZOWV+OyST8KR46unF)f5=+bprYZs zz9R1F+p%c@i$z6G#%MX;P>%7s4mye3N`kZc7sHeP4k+SrP%A^eH?wq8l^?~3oEOX9 z6O)bNVA@(2gY&wqqMckg4C=DVcu(xZ#sP!(yo@y&^g0J#OjtBg$@)kN#zq(+60-OQ zTwSWolbE>dg+4o1=h;F7ozu~hDyzj)o1OI99J){+MK$T#>Oi70dYwl3bp7Ms| zmB7Rf4<#L=szq&79GHx#O4k3FF6M1A~1OF=iO&`Br6{)4e z7kK%W7lztM{-&Hzu?yIu{|*TGN-)bt#!*q(=D6*vCW-alw?h6_?()E;cKJ8_!y(`* zHkv37nB`Cd(JK;ynjoVcra>7`Z+H=nHx4^0;|#V^f?{Dvy~f1o>K}X`i#E!(jih%Q zRGggL*RjPdFQ1Gul6D&&R^4A$nf8{f#bEembnbw@km_yyEJKMNInB7@KB&5r3Z2fB zvYs2qDo`wm1dvKvT^w${y(a0mI`hY4Opuahfo3;f^2ZA%7d1u~6b5CZkZDN7r(VC_ z?sk{P+Dnn+t4A+}ad-ahSZun-ftoHf6#-Wz0mBNbrJIwEuoh{*fPEL&*CeU6lxcYD zp^!x9G%8Im%rrM=TgYXO@G3mn7=6}Y^oo{p1J~_R9~spTgX%VPCOfvN?$9?a)>>p@ z?74|*%nMh}{CQpWxZ?b7(`QAJBTL7hJMHTEbf$}T`0SsNp-CmFGf?p9KLEpHbVyuO z@0;xyGhe5_iENT7v$B$LJgD@Zk8SXz&>M|NJ_Z$f&ZjMy94)lhm<2adl8NHI`r%}G zdBb-Dl{bUb`452gxBc14?BaQwx~j^Y?MaWptx`nyR48c`z8_-D7J&e$~dr85tKx}@9DRrd`lXt+GHYNP#<-~bC_ZC_TO@-Uf zN_w5mICJg`+7*5a+xhip@A(Of(Ho4(2cY5Qx%K{s=|j*oQbn9-;M^Nb!9p5_C}k{) zjvM=%!E^o-|4s3mL2QovyT@-6d(iBgWKxZzD<_ zTwwpyo-hH!i$6~cD zOIN|XhVR0XqqhZj5u?hcNy!XCg+q~jw(qtDW+MX=$hvmvqPt~~RA*Nvt=JTIF^H`7 zlGCi%o^$&$$4)AEUu5t}2a&aWEtoARl?lBq$XGnXjs4s@N{arRCd8Rsg?^y8ssUc^ zdC~kT%@t1K^Y<80lpopCqH zPn4G9;{lGbCET?Wb-5_sli7S8<$I?Jr->Y&-Jqu$u$f^}_W(SJrcW2u*yk}?w!qE& zsu_QumnmlBF3L5|JIs*D{-(9}0r;Rt@pRIzdBI@tPW(-(1Qi99jIG87AJL+Gg8|Qw z*jP_I_G(?cUOLAv6`S=ZlF!6yoEoLHVWx+2Z+fbD^qF@#5hiqQs!RLf1|%p9(}nSs z5(DfY^Q<7>NZ8qb%Fjwe9IMB3!zq0L80TwW z(MK%trFN~z@oCtobV)~Ir-UYjAxRlxnLsmcs}mmTV6Ye~X&hpx>2v9q- zhK$Dedn-2kzIWIPxx%G({Px3U0kT6%qG8Up0`JYLTR!iy;YIeFFwXpNPGVkllw&W7 z6KHLh(kB?U8g`|1%1QqsRDEo7#pgXI&eL8v%`c!<6aI$MfyAAt_xil3K9+0HCdwIq zJxes;ckI_e8QWVIj0H}9>tdY|5l;dd&of? z<|f+PO1h~Zd&)TIk!;E@`<94u5e5AyJ2W@z)0rR?T63<)-C!OHl;C94#fXj zLU$MPxVLO{!O??_cl0B{i^A%?VvA-yXxQ}*Um2ksZeSD6sC?vJ2|ig48^x5i&N0lC zL=tD-Ly_ofCyIWDztO0Puw5Iwnah626FB6(KD35g@Kzb6DQAN7=-Na%wD%*|Id*S~#XcF*(;u&5g z>^&&&4*(Y5*9V|a;r5PKH7)ZE5gv;jx^hbt8&bZ~QBze}hKA!4vkeAr8qWBBUxH~( zMx+9Qq$?+uJ4DVexU=jx3boIwdUMh#WXpvi6kQHzc)rBPLkA5B>B37&VE&{el@IZdA(u z1Paxp{4D>gBl?=QR$p}(I{M6!+O_0uo6DB%DaSc?tjhOICWSOr1lP4pM$2Z_=F&d+ zsFHChcMfR6DbOkjvj3eX%1NRCF@m#p7hd;{&B+?!fR%?23R3@wx;1^mUGwS3OE0WN z$9&0>&@3apK`EnjskkOy3fJ~etcgjqAEe#&XfZ-fnKou{6lB}30}iC0+7gv@t4NU) z#D_L0A<;RYIUVW1nWPUv2Wnr?5`LiW;=0pMapKR0lb~LZVn=>KLkSu1Y2;f*A`gv| z(su5U=zJMtK@oxU)!XF@5c?_WGXzM;h9&D;v5_4BOB%ZPDO#Mi3fKbXk znjU6WkFFyE9gmn5F#0;tExtg~s*a2dpW!R#R37J4fn}q0Z@?CNZ9%m86lT5^bS3mv zD!QyPSxb0h;g$;G15nR_&ODZcD`wsj@Bl*R19Gw$6OLJCI2o=W>z-C+6{7{6A=|v2jke9AD0(Ew><^H z?vSVqY_Q>7+K1^eo@GMbB3`BEBl><&M+GN?QI~I+{lDuwL!cwp^e#6vAb)AfT>L$u zSfX27!Z=x(T~&die=pzE^^SC^0K7%Nxy%0({(o8_VqI-^g()T--|aX>=ks665i$*uPEvcH_8jJA zPllWYGaKQ=%|o%OIT^2{Fbn2hV0VVN@Vc?o%sL(V))m;nc_oB=Xk(~`!W%H$+P241 zZYkqZmpCX{RVOIRcU7}5i<WdPI`L3NwUKEMy@v&t-Yx0KO#DJ zo0ZReN5plbN9~6Eire9CUOa=_5ptTB4TsT!peormxBkM^6vfA&O(1_)u#T{uauQbJ zX#ckTy{>Cu<8-S9%a<4KpmnTDi^#67;9G#lC?;URHUe9zi+Gb?hD3~+wzrnb#c9Bi zytFO&bQoH|$A_1cw9O#MpuPXVL}MZ$#O>J??OA~wOTXvUB{`$yQY*{ltNBHI|M#nV z8@t7W36Pl^AHY6lLqRrvE(W&sR)Q#;7D>3% zVf9#o97oV{G@3L>asgB`bhgeQp~?0UHtr^gIEyOH+vB@DqrrGGBQ4U9GXNePh}%w z^g)Ampej6mb8G%_aN+sGi;%G2q}IgAZS#2N~w$0;oZq8n;~cCy^4cT`?Ssr+u)@+*jB66j+3L zjy><)UU}v+LBy<~g|CuF)75=<(9iavt2-7k2tNwuuI!~WT8qq)fJJ1v87vHKN;LZ( zM5*@xq-?e_VH)*9Ev~n+qM+Opv8KysUXrRddZm)%=5A~p;reN9eMc3>>}dsh%lIat zuL9Kxn|7Wo^utsjs;N+QA)hO497&n(jPgyHrGx|&bUXmT^zD>XG$SaVzRD3QvYNXU zKbbs=F}xwbw=g}!Z9_TA&tx^Nn&YVrOX@tna?(|B%*1TU!+o;$J^``BOZpU14#;5b zV$ZsGwQt57u^Q^siRj@=KFbp%%t>Q({LGs$fG3^v75Y`YuVJG}2(p~AyucU46PUwO zst;708z>Ze)^eFB7QkxA0`sO{&%(e$GApez>^e7Uj1;vvog0nBw+G-gr>*nW#}vnB zb}JHdhUrWxsx3mhwtP)sJ7dm=i_3QXqe*5mL8uD+j7>ry%?7tyv!H^VHeRR|$knsCoD_ePgY>Jl>lK>s_DPI?$hzXRrg z8U(O0L+t&FlU~EzAQ5KbZy}&%4nNxCb0QGX5KvICKUO)Qbq;9RgNCJSR*c-`R=VhASO(o&(X8CKqTd5e>dgY}p-XlyHD zG0@PKY{L#-C2xB-Tn60F9?ZJ0DU(#hF{qH21|`dN8R_;=Tz=zEX-y${_aCCy}Gn7NUv{a-s2J zvI6?dkX=v{pSPW%>T*Y;eK)^e?M?-iOuSPG3%;RZ7x$TugDi*_i$7U52vwZ^CWzyO z4-pei-0dS=H0C#-iaF~$cw=)4ckNR|$58QdR6|$mTS`S^?IDY{oynZ>+ogeuKC^}x z?eGyBqB^Xkxo778&+LDVl2I&a!)R-}B=JiKEB zH~of^?Mv%2kujnq>UUHzr)%SvM;K^b?3;97yak0nD-^emzq)bVJ4YoS(DR=D#P<2F zIW&$?bZsN~EAfjW{3eHzn{B0LCxO*&ljbnc3fsLAMqnN;^5~wtr;)!~V+Z!qQ>yX- zAio3Ol8AbbB)M>7vUf}e$|1uoYJz|%dTD4e#U&|K13E&Jw0&ZmT2Mv7+Z3{7veQ-C zFYb`>ii)1h6A5e5&fl?S?oI2zV79@Ti<6zGd~f5l-VljYHa=%M1NBp%=XszGymRnh z4|6VN;GD?MzQKIhwF!AY>K~VEfZ4-#09$xP?#Kxl&zOB4pZJB)pHya_Tee1xgQCck z`{^nrj)PK?1sRFbj7dSP672wU<^0Hfem_N9h8ne9? zcF24HTK$&dLx=bc@91vz1SC;5!kbFG)2L4D&0PEDA@Ol4}cmx z9IZq=V@T9CJeX_B2KH&N7`u(RXFYqvnxMB+WudBbr4enw$h-sX) zJOFZnpd++A>f;d^91;cr0Sp@E@$rVoN2(#wK-VBJ$XMfrMU{;lC#RrL$(h+Xg#6mXGqb$f+l!>X8(MTPsm%x~FJyjxEPyCrxJ>+T<0%iP= z>0533B-#HgK&|X8uf$sp6HAIjVji;0k!j&O%tS(Aszb4E8OGO`bxrz;8tM=#yiTun z(i#!9qPcW)e-VRKHPCUZbWplsHDsJmfEJjBj}(D43G_#Ys3*$z)nPc=_O9sJZ*IBc z5HvNd_Vph#aydFay8ky2Vk>i@nWUqQ@dWhZ_V?OI2(ef#GuT?sog!e`6ms0cwyPJ` z^i&kmM*B{>VD=lHICHgavKcJJTyQh6kR|x#r6e*6z|DLjgo58qBRtemVBFR@?X>h- z+On6or23*?D8`av7~JimtY;&v<4jdE(y|BcOq@;TN|{+Et3b|y{r31oSKCQ*K4dvT z&T+Ee;-9?=r@|AYh#x-R(L&4M{&1XDV zAgk-dV$_unRq%Z{IfG@Bk;sO;(%SPE@7Sx;LKtbS&~W8N9NxGOo17?F2kpmjJ?k&{ z9&#sq$<;CFDbi^&a)&H}onn;D_G4jg$ zSYk6Y`^jxoE{giQ?VQu>n-ucdxl#;Sh7V{>K2lPJxh6VPH-^MiG{3iwbD2QuLA7qlx zQ-bjdJO(7j?N!%!x$VOgTb@>Xn-%)!dIeMGkgj~MQ)E->zU@YGLsf-6E}DfhV8qSkjdOx9MmWIT0a z%M)?Yl@Ai%K<#6$)jR>sS(UCR675|Lvn37}o4&Nk3#Aa!(k>xeq5wE@l zMnm~T&Ta0IBl^ijzRGIZ$+;^{bgE_OXEt1ZQagMbm5e=DWhqk&=tcn-XWPLu^o;%m zdlt((&OTfOUv`(qUKV2W1O->2fN8xewfa$R+j8R`oEF9jdWsoBm{AL%^Hg8yxRmRh z=8&t;U&M|xaCaf?QpgWlla5UD=8Jk$+0b30w|M{$pM{b!CqTE>f7CEuLd=p0F=ci~#a`RBtsWA$0(X*E z|CStyaJn;{lF_I(s*>3J?Uh36wUa$l6-5cEE{ZrjQEfFs>DsGaIy|JJ3FCOW$$)EZ z{qJs?Q^Q|c-?k@ddau4Yf7^O|R9*Pyqq~_mebr4X-6u2m)kOnYy7uGY|G2SIJA2a$ zIArQ`A*Yve9fel8XwWW5RWM(%OlM$3w%un1+D~l6r3WDw>c&{#E-tyP&ZI&kKyuq+ z+DIWa=g<@Z_!i#xeO4*-MTtAYN=Q)CP%y{*o4=;tpHwW@~v7qZ`) z-FF=)Uoje-oMf?{lH#WbQd`*s1~RvlH%~LASw`TKpC7$iboA)2oK)2a*Og_x8jy66 zCGSjoALraPF+RqV>_}zwp+Ds~Xr(WK`3ZL3iv7%bgH+FzO}m;`dA_qt%f%;Tn6yNL zQydpO4ipWd+e?@9^v`c$m&6)dBEFgP1}#-QTLm|+D6`$ zL>V?+Pv`d}1r3gmlWRf5RPypsZm_a7=5YjU9V&!VZoo!!I3HnAaznGj7(0yd65@F% zrF<@`^#hN@bvnuI;_0ygtiI7vu8aDOeh!|Pyg=-T=;@u`>vAq(v~qp`kieI@VQ{RE zmSyHWyws$kN>MLfH$@XBF*Pv9LNDYXvOv zG0N*?Fu8B`#kC^shk3^M1S(}0@3YV*&bD1k;01>HKPt8e-KnmPAq7HM-~m8ILP)lA`LOHx;LRY#uP6I7o1hI!+Or@-y7KQzSo zOG5lD6)PE%;kF2R?!9t5@35LpoFsp_uVS-X=*~M_uT+JrN*q2U&ToR}y2yzW+Akrn zzVv=-&^vt%Z*a|M&`T^zY$?ST+iHyzahFBC$?c_@<(LQd1&NZcn@bboM7+Yo zIRrckX(<4;)N>?zF`%i>@&#|DeShK;cFAr;w9s38wk~ia;f<@nU0k8rb+u@*8)SOU zCMPOj>U-M+P(knfL}uc=lE#Sln%8;N+AX<@rznWn`kmBrvtZ`a=+KGu4T8$#E_i{1 z*wyDQOS}hZMz^~XwfHoQ+&iz8>0M{K#0+_lMm-YPpves?g_icBY2)xB^qykUh++7m ztSX#T&VE=HS4Ks8Pei6=dX5v?33mbmM^u`%INw^)W$~Ua?uxe zfK$5;&^Ryzox?=p(dC+?2!*jUD(+_tPqoqTk{|OtQI2oxrN-a7e_GUp@%jNccGZ{; zjGE_5I(h&yh8e?VSVRNE)=MDH)u#v?N$YnU1oPT@8Ak+6KVub9LoHHuL$+j4@1mq) z!s9Y=ZPlY3T z*SV(r65Nz3UZ+d$m1##|Og-fty>~9tSK2!irmgaeqYj^}Og7#**kIJk;t;Hr1Z13~ zXA_$oi`@>mug}~hs3@iIqZ@k7@tp(;Q6yP>;y_K0?_}?~{jEqr#L7lrUo}N(H)mwH zFX@%6Tq~J}8~jvp;7n@{nV{Grx#as5!O=wR5Xs4&p!J0`37*2B9c7u)l)PsZ$^8tU z85jubpOPCso9`(c4ecI)-|@eJHaNm-mI81m@gc0Ox(h5wP$|n_dAJT;EIZsg&`O~d z8lb(6VL}_7tl5***1J|4UC~mq;wLn2$dE2AAH>~^5ziU`Hm)91>0~ETteI8-K$GVO(KDw>r%kS7#XtIjd+be zZ|#Q{dcrlo9FQD_^xcDtu-q{(#Uua7yCRezFc^PkxAcN$ry7mLIkn^!DOkPbbNFSQ zkx+(8M`fwt`R0a#r}%S61c!uzd8q|T->4y2?B z+hR9ipCqHINhvLQqK+z;cgeNbC|XAzG#uHGX`?b9HbKXoy4T9}yHUQrU}uYOpEWyK z7Df%RJamPijk}dx$b|cnYn+5@+msL-2 zELXdL*@u=lMdh;XaAR(qV7mSwyyxRwzOywn$7s=ih#ETRgrz59%H zK!U1cSF%(@es!VsFkxVtwIE+B*2~FXEIWRFGU%;0jPcpZ# zX>FJs+Sz2+S|MWZpOn~?IbwC8Nhvn5CUvM8Ze5e3c7o%w7hc{WCtSz{@Ai0Q9pW3c z*T^i`)vGT}Mdcz+yvV25v*3zl!+ zUQ_96=lOxDJk8Sq$ypxu32-~)n+;D&Rdc9l;YEL037KTBX&q0SV3#r+XY~+(AfC64JGVOU=zDA&gQ}1mcdJ3>qBo z!89iI<|p4RG!hKO&za~?VdK8KjI*{r0sH2A_eCY}jjF_wg$xN{e-olVEP=RgT#=Np zElWNCkCrz0)N)z0OFVW*Y1NM1l>vgp)5quwbi6p>ywRx5N9g_;Q_C8_fkA`a1rjN$ zq`O`lSzMRkxei0{j$9Mp*ergtQT&3v>&R>6N+iO-UD*dfeB|+W?PkM~HfCO@T`~6? z-0>P5L9bXj2TCe>Rxo(2>?SJ*`l(i0iIy#?c|DC7DFI`+z$b@of`MN13@Gew&RODV zs3hF*FS3ED-_VqQ(!1~C+Y&0e@Ip|(;hkP9%8PC6MC=*e zz+haAxr|MnJ)Rsx+HS=Z#Dx4RD^O#g zqx{xaNgblqjlPy;qx0%gB)6&cgXId^PQi?FcvW%aCqU8I%R6$8$7^1CnV)?38GSLp z+cVR~EMg*iH|x%2P_Q71`)4($ukMfo`#L|J7RjjS$B}U+CG4qYb3L(|h~S zNl@%W-0ufp-)bhv*tgcVWvRNZ7H*%VSAAxpPF!`j^5ic%Y?U3_;nH7vu1MQ*Jay(N zKkt^DF#PW{*8gFA{1{pDN95MW$Zvi`uKE$#{V_7#kI4TEW0{U$j{kdE`q%mAlBZ+b zH_&2T_o1yNNa&M{^q<}`H-Ca61(lb*kFfKRn)ew|bhd7xoC2PmR3%c6CCxNg8sC`R zjet(a>bs3C5|_)xkLSMY0#nJLGqesAJWv~a7scp%01mB}=qxMq8pHo<$y43i##??< zTszz0vHesI3i4~FBYDa z=}-?77liJ@a8$5kxgxxjl<}C9mu!J^;S9jP3DVW?8VaXp;DV6#P=jT-5})iz>polJ zWZ=;9Jj|BTp9q7hV-bUIh_QkyoI5wmro!B~0sng~Ew6<^#WcimmUgFItna2pKFvg@ zivIt4q;bPg1Cflk^_(=YVtwARAR%zy)$`^6;ul2Gw}+dRkd z@K?S0R=P3g=SS5XV_t9nuM?#sx^wa|vbT`iLCocfj`s&&4n7f_bl~;PTX(q@$8POW zq=v5-1N-QDNzduE(uLiZYUQ!HVS^=YRpR*MZn5jWyY%P_P6u?fy3KBof<9~;igAmI zIic?fp=2ql*OJz_4GdirAc6;a97M~CK}Xu7B3$4rlGnGKtD?Ec zv3Xn!<|acG7?in#Qhl+DEZJCTs+Z;J{DUv1M6aX~-Dz?Zvd)b$D6~oqM5c_E-K2{9)$Q*veIO(7iu6KfkB<_k++9j8WoSM^N7gJp? zyDA;X?!EZNfI7N2DlmESf`KptL5GnzNLk6fM597gLDIO5LPV0Jrz5av#Z|Ugglam`|~i7;?Dg zP#yF#<_fb?sl-h9R+l#>C#-z)PKVaE&eqVSn%CNXBqsPelzxwbZ6bFtU6!$^V^JlY z)iZJm9n#q`&J3pklpzt;T6L%k&dbE^W~wO+@m`fZ(h^z+qq+Wu zBEq4XN=OV5HS>CQ?D{3?jmFZ?HN1Y)L}&-{Rj%s_-c{at^_Hco@v-ZY_*@4VC;tPa@)yM^bW~PEx!(3Vh~+u?SW1~CaskOQZy+J(@nMP zYqwaQn_MI%h>cONy~CWCV~5@Z@ThhA8;|zcYxQvQ*Gf&y(Tt7sm!FN z#L_vVoONSJgOwS{TS$>*!rcsmdq&l9|8i@b8C_u=>!(Xb{_-J6jkV1v4*-+p%?RiQ zA3Z7n4h9Yd4*mE)Nk86R2K~Vj=(!uveZ4sU6I2prq1@Bju1Td0Lxy3AK$FMV36={tks`pkM>}?Q+AEZc7&5- ze}1RO2q!9@5egHQs30a1LTQt>k}-BXA;;GO#Nb6{zu_vsLw^fj4=WY9>3@X^#)B#) z$P9(4?VW=L2?6#1sLBq%CTPM06E4t08=!qXsYRFKAytM-oTA6?@5eLKZdRg^gIi~+{H2wlK{&X3?xWYcEv#}k*pvSqNtFUg0;$+ ziZ;WVtMNl;1Pm+E%9wg#ViAPEIIVD7+JGxlKR+N1BMus#gu`;Mii90>Bi^Ai8WB3z zBp$gk6buSg=^Yx~O0!&+%%|;suyJR2yC`BaC5*>Vs&6hG^r~qy* z-67>g5!0KNu+xvb)oH=zdrujYE%55<>)wa|G-0dm!~iF8gy3qWRPB;j*R4<KNAIWUzr`~a|=uJV_+@yNv3mC8} zaIn~tV>RW8Vm@R0rno@J!_>^RH=pk&ad~4%c4_fN5}E zVW@&L3vn91mkt2J(Uidg$=6|2!80hr5Qu36FLS`&Q*F|RhZOqz8!BOQ_%>-1ZV1B~ zAti^1QK3;uvtjQ>=K3`C*^32bee)lEIZ&h(m7x=`n^SMZ5w(2{p<8HIodIsVP71p< z94GQV%vnziSCcv)ja(V4&AD7X5D~(oYQoyDTpM>jt)8p${PbwiD{J?DYDhcJ6AUFb zocwg%1y#CiEK+8PI~$H(lQ-mTVQ>6Qt%O$h#kYA!weh}7L`QE{}%zAKC1XlFzwPEfIa50)9Wl`dAF^D z>x4{4=(EwCk-T0g(O5`lEV2-*9NtL6q!tIi+%w2n!O`Ovhv@lMBOg3{UTm}Suh8SV zU8%gjjwzp~P$ZJ$25QDxa*f2T?iHPV)l9T(?hwBEDz=&-^#&SQBOp*}F-mE()5J#* zas<`fcah^M(HTdzp|QLzKnFKZW~r+i#MfbtRaACH)P8CLMzgmr2D#9{+{LD)q-;uI zi5Ml;xgNNsH)U~)(cDpL&ID)P{(7>bR0bEd#_SrqYk=0i62cWPn+Dhz ztO=i^C`&N}{T&iZGf#hsb2=TM!TM^Z`v^Q_$9OCf^r$mTb4O8`{{Cj$P7|4bqPcqV zg1l)C?3vPg)TC6>J(83t*m^R)V66O%X5Aq?9PTz`6kt1KWO z{5h58(!IDHC6uCx2D>hT?zN$jGCks3jn81JfgZ0*Ds2VLp&?I5Gz&N|#GPrC#r$C5 z!xJ?C*R`h(Rm~k}vWC0K&1n=L!6jHo{e_SFdoe}}B)JMu2_!rt-y$WEXl*jHmx>Fy z=r$x{qCOo&7i8!hMxb130$>8(XH=!RqvpTdx+=+;gpSQSj;d{QY7j?|_*U2_0go4i z&zx(e>V8{*Tn1){_R7EhS!FjVsU_&8F;uepgj=tw-TQFMb1P*?!G+@&`vjWU6jE_y zVqxe2cCq%%SKcfO)zJgbOhvZRU043`;#48Euk>*LME);CW}&6+&ai*F{|mD}cY+VD zy*F|EVoy>_?uPk_dgH>=o^oq(Z5brnr7+hh5~M_1oow#LEORJbz79YqVSqDR4=_`r zYL2)oZFAHz%9RY1!q<2k3BbE@o|Kp_QoQ*HYHmO(Ur08<2pH((=uH$535lJJB@1>5 zw8a23<`3M?4(X4c?;gbq@-K)*W5~Y{`X9}`2UrtZw=kT9009Do(0d4>w}4bZ2oNAt zLlqF|T|lZ8H3^}Egx)n&sY(|Vl->jcq$(;+5ETWi*v=n4N6$I;J^y{*`#sE1J}t9&FBr)}?8DqOQrz3a#TuxL1xF6)QU#Co5cA5!S=JcEy6iKVXe zfr}pS*^4)}nRHMIS#}%_>T2~GIj^!ARoIEJ%bdU(>E8f=U3GDF@QrL_oPBsum+ZST z&8e}BtK3u{W(n$=-J@L6c;SXaaM|1ep<=Z z-72!ghH!k!@Ts65?Zq!FX}Yl%xfC=VKw9sv$@Uy`Uh9=K%pGH}n!l?4UXvU{5(V=!>cl3M-G{)Xsm?mG)*655XyWNTuJ`WYvaHflh%drE;?j#MX3tjFr}zgVy^=)UJwlAS zhhKt_$Oa&hb-he=+LvrLYbEDKZ(Qs^?>E3qKs6n> z!*QGLEXeYT#C8|k#y7hhsUgv3QPdaRd*55d-c`5t2i^c5Ub2?9n3i!t)Gue%^-%E- zY?9vr{;|Ob<)Sga1K@-M8Xbj8rQcX6jQS zz|kTBUgREr)-XLf(B4yLO}_BlPyGnXvt<6ZI8a%2>3W};QIL(9;7w~Sf4^h|6C?c@ zA4-r5PI~hjd&ET$J~YRzeEjxg2$`$pNjaZu{>Z*N!o6VgvrwC4643TEd>W+K>j>x> zeA)oTlm#x#rHih@dS;F{q$zW9oTmEE*3`WS05g&i1x%1dZ{lwnS%k0P_NN=8WI6F)(0@m?r$~_>{~_>q3QfZ=1S^Fo^QYop=%1E;N2G~t z>=Z5s(|09(aa*~_+h{yJ6d!Ss(_dk=d?XKK&K;hZ8L-(?*JC%wu`80Y0xq{ALnKc* zL3>&dt0%I+!nV^~#a7tvT+m0$*$hPI5Ma6}NA(%iP}B^Y%^$6nRT_JL^1N~Y1Eh>O z-6TRlm+HAYF3X-@d^+JEd@eC+bd48Ld4;kE@8QH)e~{|3S_1_ zt0swZWwRD3AHOMaK|H&0X3Pv_C&q+9yy66oyWOi}z{0$n$yDgGDx8a=m#KlOqv~Wt zd0(mx?NcPy6?#Ns>zI>su3?ta;3a|%>vSyJaUzE)9(m_g0T06*ntAr?xa%igx^f_b z+qo~snV14dr8_BhFo&HlUUVemvY`v#7rFqizK%PIEj+vQKnQ)Z*_&lE6cI7gK8hL& zWN3QeeUP4+G$|odq&pW!Oc~Mh;9`T(4lTFOsB7Crd{pg4e`n*WHqbwR(cF zN@G9*lK~q#L9K^p8`4t_^G1~PoZY3w;TBa4wZ4oe%Rnr8)y%oBz(3Vk2KzIkAQT9p zp`oDHNuv`&U@*K#pP;JFtwc``QlrIqtYYdV&mVghWsuc#bhHci z0W#HUlI1f6nKpsOZ&nX|OuHcdB;ms!K%(Qc=a$G9lRF%*`_JwEH-JEj-G58}Lv&!; zCh~6vep&h}5UHb&p}F=c=gyN?C!RaMm+;gXej`4Xrt*(FILWPx#^(55?|T0k4`9+` z;3vx>{f`(#nq|0NtdBHEFr$}m&OsoWz(+(gfnXR`+=Lu-z;J}!!eiZFn8go}og6vr zUmnV5xnLSDiLA2VXT@NX>EY|qdh9gK>j-7C;g=re}wfNH)M}Rg#TdA_CG=C`= z0~^ze!zqRoFV*)rM6m}RXUyc}0azYst|nh~Jd!y29t+`d7eG-y8mF%_%lPx9JMz=p zJ1Og#V0wAX4C#&nozoo}0)W=@l4}x0J}hY`qgZVL7td62G2FB}b?~Z)X#7JrFMzSG zDK$oK;-Wr)j(%d}8;~TbZL6;NHSNWFz4!;#Co)`;_}R5sNhN6=*VEDQl`{xFrQ8Ov z?b#Fh^g~irH8oYKFypu5dVXKs%o}FTRv0jy@akM)LX97;DNsMB_vq~TxUyOPV3%$* z#vLoqlQf{7fp{bont{O@L3D5HoZejY?Yz^OFK;j*NZsBw6RS+458QHi5K( zegw$TgQd5`OO_L&(2TDp?FA0(hk)%9=$*wpZ(HMKi>|#gluaSn@L{{@{4jWU66qR3 zY>QCJVr$dLaVosv9lt8CC;mC-nsNWrxXFtn+;qhLk+Z%Yf#%qbc3-)D38B!56+GUa z+PjcYKOC-~%;=62)I3IchFijE6D!e*Tg)sNv?^COXC~p9U*7a%WULUiOn^^bu+%-Y zMW8)T@HvEiN1NwIjFx$YTL5C2H>bIGU}V{aUT)uGhp7r>a2Xyh5j?kh?16M9pWgt) zg{JS3ofVfZL|AY{-*bCwrMY(L-<1?p)xlB+SgbjhI2SLi_4IaWJ!7eTcI!_1y9avW zC$CNI9~2S4pkVHPdQX#v?RcpsvP=~4v@$?MA#R#|9te8_7rY|E?%LK6HL-P$7*Yeu z*|qQYaH~>N0*x@&(M5n*fflbUg&a7=9vwOt?`ZZ3mL+r@JQF*dI`%A2yK0Ixo;8Wk z#fB7?wFIPjJRu(hq#)Iw;3PrFHBA;a_^KWUQVjzACMI2dQ);|SDU8;`2Arrwh~b{| z^j9p!Qzp+tsp)!baQ+1kO!q-IX;UtcX8ciua{`uJjz=`IQf9swV5ezc)oO-*gjTd> zaa*{%`Qv#aG~9W_9+h8pxb4T!I9BT=G|AaR^r&wL;lYjQKQ}WslbbvGTn~Q#Vn4uw z8K_>#+*)^+FJxG6h!R=3#8<C2DSD)LaM8HCr>jX!hLI98zcZ!ucbT`+Dp3ggt z7nJ#O&}_g z7kZXM*^5e|t|`0Q3*DZCQcvV*>u%hmO*|r(=YHe?S1pR*lydD%9FC|)cf1G%TDS_? zp~pz8{{}$!S^|CYi9NL(w5%mp^NpZBEcu<~oz!);%sn$3yWapLI1{9D7+{N3^(YsHIrj7-QN0Ytc=oDX30m6M@*AC!JSD#Ya#97)rr1}<66N8Bu&$mk z-mjjzbmS=uDA)sbX#C2@TY9^`0C|cn?Y+Z~xf*`VcmX3pr0#uBi1O!>VT$^ZOBP;9 z^Ybe$Pu73FZs*vrqG_zn>bt6=|G9I2=ltcP zl=FWzi}>YZ{Kc)``Og02q5K3g+}cJ^*`{{crZPWO;eG-Tb{GJzTkIn;k@ZUz{C7dx zv?Cd36GOAAQB7vQR5AT7NK5RCc)U$}0n_%--TS8?_y>Rh0KvJtKlT3Fq;{|=C7t@?u*t`GjH@Vm%&n3f9~_=Cq31^>bGJHw9((!^-|2%3I44)G`T zdj)Cc0JN{@Ncsp61_AqvQ5qZJ2kCb`f7{a7zHL82YfdK43if(%HNQ`^ZZo8^izZumY-}He;~m>F?4&sNdE%-txbQY{vnR~)hB=Ip_%xl69or= z36MY9>vx8~s{&{IHL$;efcp{2zikkI(f^lP{EMr!u){I5zCrT=0sj{&r4dB(1@HoN z=obG~Np$*@3Ic_yG%flUTeO~|nSoIyC}1pp>iiY(?|oGtMPLHZ?EWG6XD9yyBl;Vl z|CiEVZjpefNVizD6!_`LPf4bqfGG;Zu5tSz@9XAY81OF*{|fv)tiMEl0Q$6d`idO1 z(2P-#)vg$Awjc8g{Z;bqbYIFhMDcw$M+{RkDuu~Iw9~lbnZ>ujUu(qmHJKA z|NTf+L?4)6#*0DrfI(>kIuxygob6nx7)K0poEE(>S)jt*qo9TNL`m6x(!2bgQ#{4Y zOiVfjvuW%YI(&pX!hO83!gr#auuLFAbHb^MtUMv0{e@C4V#wB=Sc85z4;skVJd#r% z#Rl?F_PyKnzPvAd!q;(pc}TPROi*8hNPt$Y{kYW82k);;98GD9Z1c@BHV#W^xswX} zNZ)+#v9`{KhE5LMs8?mk07-rnBspu)FvU7L4~tywTaympnAr1cgraPxPt4{JyqQy6 zY*5^gX&E7yezdhlJ{pOxv{CuQj<6TrwNZaUAf@7n&D?D+ zZ&Kb)%3|ShE=>4@d|0rse?JT-yb8T^^^|tDNHQ(4sAT99w}YN4BtQ3nL806&itP1ls0*>(8(k2LG+jOv#}_k>=_HJDuv7)qMZUBa zW1$|IZoC)x&S^W}r)sD|+~&v)^#SFq7uL3U;(b=Tk|l&1;W73R*9AU-TB(k9d>vO} z-qa>goeP+*DKIV3V!#8AQ*C-8&^4XVT{QRtyu~x$fUSG{j)ir{cvI!VTv}_{w*O~m z-Tw}V1^9;6_8;;`q>c2e73M!bKgc$2kkc&XVsh0ho-hz9o#0`5ervoj*ri%X)_(k3 znx@Bt`rfb2*EKxeUEGxnut8Ka6^XjGRf<{ZI-Cxx+9u?OK1n|8%nY!>rhFaROAeI? z^iBu>ONMQ7bFHM^?4so@x?t9TM+NSu9gV7I2xx%b`}(nbK%Z|{H@CLtn?dBz-RmyW zXHrC!Uxc*4P2PLW&7j8)KXL*1?+1SnwGTaTF<-5wVsuYdLv*S@g?&+#%kuSR+N%Lq z$M$tr^{Pjt_s`Q>p>Y>C_l}k^8Hz=T#ZE+T6gI295akBMoVcDu@U?xTCQ$q&`$HhY z4YF5aD{&+1OUqW zlE%>d=DRAO^WFKhCvM-$JZTBV`5HUax}Ub1)z++yZl*=R{Q0ygA3!B&kSlYLN;rN+ z*YbUJ@+59Mo%>*4n9hlukEeL~&?TmWIxk*d$$+AmkMdT9%!vSO^pE)N7S>8|m?3n!}kmb|Mb7JL2mEO(gh7;-YefuxjRV7mz z>XrjaKWd2e<~w`wWt?+NKy7*r)nR$=aKz1#M6beCZHIEu|iX4Ei~g zgN&aH0%^-d_32UR$i&#^*b`l{co&b2rQ9`VyQ!#@;L8_8vLjRFpsxJ1l*@L6MCDp!kfVv6%*6`~x`+Z_V+GX~~ z{mYM`a~|ot`qp7YSV`l`4g%jZ_5C{g$7S|=zAD%^!6&kvLr=6<)hhfnD<{0zbgsq~ z2O!#ZMrNH3)=JrXKd&pc&#Y;Ra^w~GtWkYv~<)Fr)dJ8}9`MbG+T{=aoeWMhXm|6NtN)~!Eo9T=P?|^KfC!=bku*rEJ#8fUdUuguI#n-kZH*J--KWU16&w< zPAlo{ZP%V1u2_`-WPcUTWqcMM5F185da2+@_vimH~BATP?>C)=5aw|Z2j zpCsls=KenV>hr#j=ugq}OU3a7yy0@~tn6fsMS#F6+f|~)5Y$-J*Y;6{jdEza6AB-@ zLYI%@45jo-cOqIM`^#_^nd$j?q2g%@vsI6lXS5 z-4-x}T?FdHIjD75wjjY=ePj1iHrbKNGW$tqeyQA_(zopCbXj#u2iV#Jh#rYMevOxV*xRr4zgYW67^Qi`PZ;AloBL2ZP4k~g5}hb9v;{@)=p&&Cj3Q_LY)>$xj{pO_L)FIJNV0pHUl zRIONc@qPuj?6z)hdF6`>SEs)!Ip)aU7=4SWhFN|VSZcK(sq_@D%{>Y>?MYkL=n~o= zGT0V}zy5T^{B4&MlU}Ktr2h_z@AB>ohlAKoS0U}`hTDA?tTonWE3zB6)AlLWd3Dl! zt7{K*xoX{q#;whjztGDN>Eq?ZN3FIEEz&JkTt>}?Ew4|pOTL}zNy``2+1yu16i=&H z)DGqdg1jzXVIiCo7MWbmrfDA#o=bZA?_utny;tyA0{&+2laQmhK=AkDJF_ zd^}Mwlj45K#cvnK?P;tC3wx|V(gb1;R*BNt0MQ` z@)=}#t#W!^pNhIsZ^3T8b*~>AXWEfBYz$0eG zC!Bdzlp1uh!f!}v>dnwRFvOh#J*&fc-T!JD$wiDT(Wf@58{1f+hna-+oY}d2p<~J^o!EWZ zO=@5gH_54R_i-tGrxhXS-lR+{r0=U3ZBAWo(Q}HAV<5nBNM=udkwv{3qo-+*`yCP1 z*3))u4OYCND~~_)9-XBIpJJoswbUsf1xlR0#nXFHbu>31PYTfc8-Qi1{ywwwBv^1U z+32;dt)JOeX?S5Iv*zuxU^=jO{m4ziC?v{_mN=Jnu1u5`oo!(Upsg@x5_^0 z)lE3ivldR#x&9;JqdbiE%ajg8$M|c~-e055cVL+G650<_1e(~mg8$2CbC|E8DbO>+ z(diC?8w`TLa4JdXrS(DVjLveI_RJ&tL9x@mz{<`%MZR!46NIU9qYdu9CzOWzJK7^}l|*K|i_x41oO8DTB2 zd&qTN3@Pme*thjwSq>Kmmtaf*?&?Y0DhLQY;+y3lt`-gE%V3&GU$S-HkokDsvo8_ zjOxh`)dYUSwxBlsz=^5Dd_HG zlZqd}Y$T^r80XAAAg?d!4|BjUkMVk86~c=>Rp0T+!HKZ3?v@a2t_2;DD146|8B==d+qi#he$D-U;ByJvJ|sxxF8{TIIU@G~gYGz>Tt=@$rZzUf3plGfA`!sZd(_0N zHvj6-fQcTsfIuxux!B(70BKQ3JT5j;orYFOhGHJrCLVCgW>mBuKk{q=J>r|e8Q_T%=fc;||Hr!xzVp+bHGYQ2KXfV~2aQo%Gd37wsen$i z1Z6<+8JPiQxilRjo#@7X%)8fkCqQ3A9=h-vLITHz&vvPOFpS7)GQH&9&}^J$R-b{0 z)1PA!yR_~13J<}?RH&3p^7_--lHsZvMa}uqF{o9=*@|^0I`fk8rr9l*!t9`q= zUv+enX%v@mM!J@PfT|ZvOqgOV)UNGmX-#4U1u4t+Rr7~ogW{aDkv>`v)g6Hr|kfDX#Ah{dH26a(bYERbGs z7II#Kr>KrgHs>fExF|OJi!hYI!#~KpqB6G>Cecu+;`t}@%y$91OwiZ8+?=D4Y}f^M?Kc>&X!1?#L$$T^4Ol$!3?E=|R4YBXS+_V_$O;wg=pu41w%A4Uhr{NgB8?vR< zJ4eXw&*sw#vM>ZzD%cIY?(0y8wKafYZAfZoP0|0cHW+NwpL67#7~Nh8 zr=ipu8rhKTfL*Z=BU~~u!O0<^0xV?px2I>AMJJwf(sA;k3}iPMfrhuN$KJXt=2KK{ zB;_`w@Xf3w3s`e%x`3<%U_HdvWmvrt8$`#?uxhuA=h$snA9XuLG^$U)q-i=Am^r!^ zV4H#&Hndw`-v6p~_9UkNu`yT0M~;?iY`MzBR2F}H&J6{e5OVocD-*D>p@8j~(m7Vv z=$ODf7?_r9O0uB6Ps+WCqSBo&W17020l{0dc&CdQ3iJr0`!mxMg{|Igu+MKBDU6*j zd~xaYr2f0Hx+sdaSY8k%MJ>99SA7gKWdQ4NXl?cylLtU}0FR8Y@H7W0Cc(^fek_dH z$4Z|_o3plo;kkSUm$isA1`O+V_O>D90JYLoC!SWt2zBL55waHv%mfCajzoONMu=j| zJ!x%9Ne~}i44Od20R~>er|2+%CPd=JS=>qx#|s&IhuD6SFbJ-$ucI%iNHy^qtrjACK!P9nGp8+@|CKwKu_q6Zu+N4$z?JFg%4{8 zf~CN)Ddl4g3|7VlltN%A zAFdI7QFZZJ$+w&FpPv5-ZYfVY8mZ11aHxC!SJGd&{uzAcz(;?-UeZ)QJ5KgbjsML1 zFW3TaqQny~T4m;rzMx0)IB1u8ZC&2jED7%{+*Hk~V2Ttfbf)WaWG}|N zo<8qH$owIe?DZ#yOE5VD(o9rGF%^w?bIs}-%}xfUYiGln#I|@Jg+n`Qegp9Efb`o_ zOxsoFIhEpHyL1OmOF$Im64Uv~TX@_CPrk`%0G^hU=#bAl%>m;GO(K9qWzd?cI!yV9B`ydgg^$XrqkmMQ zP_nWKbl4YZInwP(f56))TV}dGJw#X;SU1(Kz}(Ql4RV}Anifb@BC^~SR0as2Y(*{J zmljnQ^t%k#^&t@%hicH)p#82GhMEK?c}0p7eQ*zlthf`~6pFCG0*I(aj_f7F)zD8d z6(#L={0Tzi1HRVBf;R4!<0KMSJy|3w+6Nh!nhD2FnEO=A(I==gn3t78E*bVLS!u{D zL$HuxiqjYZY-25dc_}X|U%`GE;9a$Z6ziqi4~WqPTPVjwrJ^2rzl@mdaJ78nbez5Pem=kR2FZ*6!;il z2Prkqoh&Uyk1&+UY6Sw$mC_?|Zh4ikhC*>BxLDBGQ&UZ&4O=jiI$!}Qkst z#gZdaj{3kl|1Jj1IJNQPe7b+)9Ak)ES|qLeE-k%PJd$}{Hwy_y4?X_9{hmoWDp}lh zUAiOkEbpdYN5?al>yn>N>8XDfasPTD5f*WQWNf6RwrBry4a&JOee=>kuc^RHctK2z zBuCQoga3X7^j3^mGK0Ke15v{Ne&zHybM^Z_fo(~&jmq7NtpaL|-(J)1qZTpKuOBdB zXkSLgM;Pi1MkKj3UF24J-F={U>k(YMUNs>ZY zLc&@By(jR?3KF&tc&685YYs&fsdVUvWK1ORl^ATs`uhR#FJX22D=byeOywk9Ett3N ze#`>0+`MVqG?c{QbK~RpTVOG(qjy3M^$EX*=!`Jo(~*#^Z=$paj92x%-=-2O270kDj@n%8s0y#ml6^Z1OruH`HaM=TL{z4VECHO!guyS~kN0y{< zc$H-&_SIycM+{52`E4I@qm$X33K^=JeWb(gD1u6zQ8{z!+{X|@Vk3WOA_ue1%}g@6 zhdIj1{3MD(uY%6>?pySOvK04^7=SKw#plAo+$Fxk97#u@v$^zKgf^LyPq1znG@W9@%PKRx^6u00hzg5b^)P)fiQ0KHyiA8l?BV6qy4=)Dia#{ zCiy%%4nVXRUtJMfs2L+KbM@3dD7Z#Ho=bluBkjn2(Bm_P1LvOP={a}pyH46*wbXW4 zqv_lL^WA>{vn9ZRV~pGXTC5EwhO^owj{%QUzt;ZerRr<#QThCpVDR8I`!ANl-h3N<Q2b`D>HYUg(uUl1~f=bQ-`_ zq|9tF;*w)Z1+IxKoE148EJlDxwe4>xgx1K70n;LOM0OYU2&6f-PM>su!)3J)`9_T? zzQxlbmy?a(k~JYO_&AJUtt@kzw|V?dW%J&*$CH%q!&4yyr%q!H+1VEwAV~<4U#tr` zbqD~zzFMp}ny+uAqLD79>Hs}yxk2A=dDpuE;;1v2&P85qEzu}z0K?N8lw*Oq(8ZR~ z<-$%&wsC|E$2^M*lX)Z$_rUT~8RH;QY>!vWYbd{;f1?WpWXbQJ9rPPuS@hDA!`J;^ zQSi;4wgd$+v-o@}R+;Cna(n|y$71{6D8~O24JCaU3gWYj((YY z7O}v3%b%U1$SS!OzPqQ-g~%Z#5)@1(bSLF)x%_-+@6ldHIw1$~MSC39_kyxOnB+4a zC*hX@GU85re*IGb*8 zlEKG+WVEwmk#<49Atl>$w~d|=o3gX$)fA?TzoEEvD@4KR1Om1iwmc9nq(Elz=X(&V zYXDlr-YL+58^jSgpzz~|kFHMIJFPYcLTKODu3Mj;4zp79XIWSFc^oU64m?n*!I*#O zcJNoVE4lB#LK9Tr5STkYv}{k>h7lQvk6GZhNG(>p5)*g~&)P@`5uS>)SSSG4Ax!m8 za(}!vZIGuQtKK+3UCymM#kx~mZ#KH?OGV^$%Z!xP&zR@6u`=7)aBC3x1#(Ww?mqP( zIk>5vJFj~OE0bKMT(6O}r>!23?~!Oe<8aE~T8079kCfbgaeRq1KyIxPAtCge6!f^x zp%XzJio}!eOUOb<{b9^EsKYJK=k!KM!P@cT-7oLGY*lZSU!^+)6D$mVwG{mups925 zlQw&14m{Q+sQmO{uS05{PO!nbt2uG>xD=CCL9#`oV#dnQm#W1GGP&X7PB@Xh=zpZ`^u0Bh(w#RpygJK|Dl>tTxt}DEws2X(87RQuxRoN)|VyBu=918S5EtJ z8{|r76vR`8hpr9ZNwt={iRf+Lj19ZT z{1ff4kc1SKP3zk>o-=Lfn(#U2p__eqyZasaO^HCh`nklBTo0>h^V$#e{PMH&t*a-N zR&zG>j;$p}%?T_(J96xi_i?7k4^{V+dvo)p=~WC)&dua^fUv_?qJO1gpk-t@_8A8D zd;FKjs4G6EuQY$=YWO{6Lr33DlKPqJ&RN4SLx|}}g}uWO*WDf+zDbGf2B|&MfC5h6 zb2uHQMb+~7YaBp%7D}69ctE_T7x0vQ;<5QJ``l>ri_80h71T2rc7nHWN3bdQ^jJ$ zNR~s4IW^7%?ZSlf;l6l74lxpN#(B`+p2-5TjZ4h#7G}LfSDxkAjOH`dTcElBvhmiN z3o06F(1WRbVXDA%eGy!CSa63Y9RUDz2LRX`0TO&gSfgZtZUIr8oYNMwI-ekKqD;Pz z4@qzF>p zv#;E@IE$0FPoe^Dqcbtcz7qJXA|dMYN&O68fwpQp1i!vAD*7$!U^CK(G_hP1h()Gn z&73YKlPRTi(pxqaippqeP~>5H_Q{mD4F!+x(y0})p=PE^ecUBVBy=24H%R7|*tV!; zo(yNYiI4us@Jgzu!-5}St!j~#0hC@+P-qHSI1+%dH6cAQgvN1BMQCeb_(TMIh zwZQarKxE(%>>16Uq-}I}#28)#*i>`14%-!Jw7f9#XV|MenkDi|aMK2Yn%8^{au{h( zo!~W2<`}!q5AJ?$rlp-B=DX4{aGIVMXDomC78pQd8W8CDFylRl%oJM zkh2|o{>sEX7jO6h!5 zRh769^4k5zgaE*!J9F>J#Eo>%jndaLRC#GY-S`v-d=FnD4XxeK0(eL8_`8A`6EjC!PX>z?x6^)iE|qOovesgsps0`}hDYGryvkk2Ia^f^MB-qi6pqyy@fSh}UxRQr)8l(=~j& z2C{%#9`F^Y+tCc>{snsmCWwBbBxfz-2u|wEm%K*=@Eb_EFMo(3tVsh#vg45F1m3~< z-yn$?UqW<~ds-pJx_ALo&cwq9lWql6(2b~4mQYI>`4O?}M)^XEOPXzD%#875=`@wp z;GJg;lC6Qbd#{6a~)QCXY&Z8l6Fv~GG zi7D*rwZjG&yEO@CGf-%?hjf23qPFUtaHpFDyC zC)zU19(&AAxP*gTMe^LOt+@qo>;ki&l7gTH#+zii=6W&W*}J5GbW7_<`Aomw=C@~p$HBV)<6N~<(UEPf2m+-2Y-$m zt}tY}Gr|vY(9gwJGQcafVfznTRt+pzfQsA6J5*@+CQ4koE9>^Qz7{nD083tA*>*6I z_GMs&*{$6+9`284et5G#fnq#Yi^3xy)4`L?hRVs2Wa-B4Dj+(q4<(}>5?0YzS@~31 zrZ*?XI%tlx+uGq=ps)j!vERQrZSX7+oRyyqa`LY)f7Fm?Q@(va@c>(vW__mf^@5Kr z000Xh*h!p3B*zYU5BT#xjjMU;U>{P`wW*=^23cBKTGq9(NqYi%y~!Q3d;Pb?{||}k BasB`R literal 0 HcmV?d00001 From 80dcce97b42b509e084fe0f2d89c10884b4c5de6 Mon Sep 17 00:00:00 2001 From: Anca Iordache Date: Fri, 6 Mar 2020 16:53:31 +0100 Subject: [PATCH 3/6] Update README.md --- samples/angular/README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/samples/angular/README.md b/samples/angular/README.md index f1710e3..fa812d4 100644 --- a/samples/angular/README.md +++ b/samples/angular/README.md @@ -61,10 +61,10 @@ CONTAINER ID IMAGE COMMAND CREATED Open a browser and go to localhost. -![page](http://output.jpg) +![page](https://github.com/aiordache/awesome-compose/blob/master/samples/angular/output.jpg) Stop and remove the container ``` $ docker-compose down -``` \ No newline at end of file +``` From 9c829ac4ba4dec0b5efb8b492c3938514bfa3c69 Mon Sep 17 00:00:00 2001 From: Anca Iordache Date: Fri, 6 Mar 2020 17:39:55 +0100 Subject: [PATCH 4/6] update asp.net-mssql sample Signed-off-by: Anca Iordache --- README.md | 2 +- samples/angular/README.md | 9 +- samples/aspnet-mssql/README.md | 68 ++++++ .../Dockerfile.alpine-x64 => app/Dockerfile} | 0 .../{backend => app}/aspnetapp.sln | 0 .../aspnetapp/Controllers/HomeController.cs | 0 .../aspnetapp/Models/ErrorViewModel.cs | 0 .../{backend => app}/aspnetapp/Program.cs | 0 .../{backend => app}/aspnetapp/Startup.cs | 0 .../aspnetapp/Views/Home/About.cshtml | 0 .../aspnetapp/Views/Home/Contact.cshtml | 0 .../aspnetapp/Views/Home/Index.cshtml | 0 .../aspnetapp/Views/Home/Privacy.cshtml | 0 .../aspnetapp/Views/Shared/Error.cshtml | 0 .../Views/Shared/_CookieConsentPartial.cshtml | 0 .../aspnetapp/Views/Shared/_Layout.cshtml | 0 .../Shared/_ValidationScriptsPartial.cshtml | 0 .../aspnetapp/Views/_ViewImports.cshtml | 0 .../aspnetapp/Views/_ViewStart.cshtml | 0 .../aspnetapp/appsettings.Development.json | 0 .../aspnetapp/appsettings.json | 0 .../aspnetapp/aspnetapp.csproj | 0 .../aspnetapp/wwwroot/css/site.css | 0 .../aspnetapp/wwwroot/css/site.min.css | 0 .../app/aspnetapp/wwwroot/favicon.ico | Bin 0 -> 3542 bytes .../aspnetapp/wwwroot/images/banner1.svg | 0 .../aspnetapp/wwwroot/images/banner2.svg | 0 .../aspnetapp/wwwroot/images/banner3.svg | 0 .../aspnetapp/wwwroot/js/site.js | 0 .../aspnetapp/wwwroot/js/site.min.js | 0 .../wwwroot/lib/bootstrap/.bower.json | 0 .../aspnetapp/wwwroot/lib/bootstrap/LICENSE | 0 .../bootstrap/dist/css/bootstrap-theme.css | 0 .../dist/css/bootstrap-theme.css.map | 0 .../dist/css/bootstrap-theme.min.css | 0 .../dist/css/bootstrap-theme.min.css.map | 0 .../lib/bootstrap/dist/css/bootstrap.css | 0 .../lib/bootstrap/dist/css/bootstrap.css.map | 0 .../lib/bootstrap/dist/css/bootstrap.min.css | 0 .../bootstrap/dist/css/bootstrap.min.css.map | 0 .../fonts/glyphicons-halflings-regular.eot | Bin .../fonts/glyphicons-halflings-regular.svg | 0 .../fonts/glyphicons-halflings-regular.ttf | Bin .../fonts/glyphicons-halflings-regular.woff | Bin .../fonts/glyphicons-halflings-regular.woff2 | Bin .../lib/bootstrap/dist/js/bootstrap.js | 0 .../lib/bootstrap/dist/js/bootstrap.min.js | 0 .../wwwroot/lib/bootstrap/dist/js/npm.js | 0 .../jquery-validation-unobtrusive/.bower.json | 0 .../jquery-validation-unobtrusive/LICENSE.txt | 0 .../jquery.validate.unobtrusive.js | 0 .../jquery.validate.unobtrusive.min.js | 0 .../wwwroot/lib/jquery-validation/.bower.json | 0 .../wwwroot/lib/jquery-validation/LICENSE.md | 0 .../dist/additional-methods.js | 0 .../dist/additional-methods.min.js | 0 .../jquery-validation/dist/jquery.validate.js | 0 .../dist/jquery.validate.min.js | 0 .../aspnetapp/wwwroot/lib/jquery/.bower.json | 0 .../aspnetapp/wwwroot/lib/jquery/LICENSE.txt | 0 .../wwwroot/lib/jquery/dist/jquery.js | 0 .../wwwroot/lib/jquery/dist/jquery.min.js | 0 .../wwwroot/lib/jquery/dist/jquery.min.map | 0 .../backend/Directory.Build.props | 18 -- samples/aspnet-mssql/backend/Dockerfile | 19 -- .../backend/Dockerfile.nanoserver-sac2016 | 18 -- .../aspnet-mssql/backend/Dockerfile.preview | 19 -- samples/aspnet-mssql/backend/README.md | 163 -------------- .../backend/aspnet-docker-dev-in-container.md | 68 ------ .../backend/aspnetapp/wwwroot/favicon.ico | Bin 32038 -> 0 bytes .../backend/aspnetcore-docker-arm32.md | 55 ----- .../aspnetcore-docker-https-development.md | 210 ------------------ .../backend/aspnetcore-docker-https.md | 87 -------- .../backend/aspnetcore-docker-windows.md | 51 ----- .../backend/deploy-container-to-aci.md | 106 --------- samples/aspnet-mssql/docker-compose.yaml | 6 +- samples/aspnet-mssql/output.jpg | Bin 0 -> 42372 bytes 77 files changed, 75 insertions(+), 824 deletions(-) create mode 100644 samples/aspnet-mssql/README.md rename samples/aspnet-mssql/{backend/Dockerfile.alpine-x64 => app/Dockerfile} (100%) rename samples/aspnet-mssql/{backend => app}/aspnetapp.sln (100%) rename samples/aspnet-mssql/{backend => app}/aspnetapp/Controllers/HomeController.cs (100%) rename samples/aspnet-mssql/{backend => app}/aspnetapp/Models/ErrorViewModel.cs (100%) rename samples/aspnet-mssql/{backend => app}/aspnetapp/Program.cs (100%) rename samples/aspnet-mssql/{backend => app}/aspnetapp/Startup.cs (100%) rename samples/aspnet-mssql/{backend => app}/aspnetapp/Views/Home/About.cshtml (100%) rename samples/aspnet-mssql/{backend => app}/aspnetapp/Views/Home/Contact.cshtml (100%) rename samples/aspnet-mssql/{backend => app}/aspnetapp/Views/Home/Index.cshtml (100%) rename samples/aspnet-mssql/{backend => app}/aspnetapp/Views/Home/Privacy.cshtml (100%) rename samples/aspnet-mssql/{backend => app}/aspnetapp/Views/Shared/Error.cshtml (100%) rename samples/aspnet-mssql/{backend => app}/aspnetapp/Views/Shared/_CookieConsentPartial.cshtml (100%) rename samples/aspnet-mssql/{backend => app}/aspnetapp/Views/Shared/_Layout.cshtml (100%) rename samples/aspnet-mssql/{backend => app}/aspnetapp/Views/Shared/_ValidationScriptsPartial.cshtml (100%) rename samples/aspnet-mssql/{backend => app}/aspnetapp/Views/_ViewImports.cshtml (100%) rename samples/aspnet-mssql/{backend => app}/aspnetapp/Views/_ViewStart.cshtml (100%) rename samples/aspnet-mssql/{backend => app}/aspnetapp/appsettings.Development.json (100%) rename samples/aspnet-mssql/{backend => app}/aspnetapp/appsettings.json (100%) rename samples/aspnet-mssql/{backend => app}/aspnetapp/aspnetapp.csproj (100%) rename samples/aspnet-mssql/{backend => app}/aspnetapp/wwwroot/css/site.css (100%) rename samples/aspnet-mssql/{backend => app}/aspnetapp/wwwroot/css/site.min.css (100%) create mode 100755 samples/aspnet-mssql/app/aspnetapp/wwwroot/favicon.ico rename samples/aspnet-mssql/{backend => app}/aspnetapp/wwwroot/images/banner1.svg (100%) rename samples/aspnet-mssql/{backend => app}/aspnetapp/wwwroot/images/banner2.svg (100%) rename samples/aspnet-mssql/{backend => app}/aspnetapp/wwwroot/images/banner3.svg (100%) rename samples/aspnet-mssql/{backend => app}/aspnetapp/wwwroot/js/site.js (100%) rename samples/aspnet-mssql/{backend => app}/aspnetapp/wwwroot/js/site.min.js (100%) rename samples/aspnet-mssql/{backend => app}/aspnetapp/wwwroot/lib/bootstrap/.bower.json (100%) rename samples/aspnet-mssql/{backend => app}/aspnetapp/wwwroot/lib/bootstrap/LICENSE (100%) rename samples/aspnet-mssql/{backend => app}/aspnetapp/wwwroot/lib/bootstrap/dist/css/bootstrap-theme.css (100%) rename samples/aspnet-mssql/{backend => app}/aspnetapp/wwwroot/lib/bootstrap/dist/css/bootstrap-theme.css.map (100%) rename samples/aspnet-mssql/{backend => app}/aspnetapp/wwwroot/lib/bootstrap/dist/css/bootstrap-theme.min.css (100%) rename samples/aspnet-mssql/{backend => app}/aspnetapp/wwwroot/lib/bootstrap/dist/css/bootstrap-theme.min.css.map (100%) rename samples/aspnet-mssql/{backend => app}/aspnetapp/wwwroot/lib/bootstrap/dist/css/bootstrap.css (100%) rename samples/aspnet-mssql/{backend => app}/aspnetapp/wwwroot/lib/bootstrap/dist/css/bootstrap.css.map (100%) rename samples/aspnet-mssql/{backend => app}/aspnetapp/wwwroot/lib/bootstrap/dist/css/bootstrap.min.css (100%) rename samples/aspnet-mssql/{backend => app}/aspnetapp/wwwroot/lib/bootstrap/dist/css/bootstrap.min.css.map (100%) rename samples/aspnet-mssql/{backend => app}/aspnetapp/wwwroot/lib/bootstrap/dist/fonts/glyphicons-halflings-regular.eot (100%) rename samples/aspnet-mssql/{backend => app}/aspnetapp/wwwroot/lib/bootstrap/dist/fonts/glyphicons-halflings-regular.svg (100%) rename samples/aspnet-mssql/{backend => app}/aspnetapp/wwwroot/lib/bootstrap/dist/fonts/glyphicons-halflings-regular.ttf (100%) rename samples/aspnet-mssql/{backend => app}/aspnetapp/wwwroot/lib/bootstrap/dist/fonts/glyphicons-halflings-regular.woff (100%) rename samples/aspnet-mssql/{backend => app}/aspnetapp/wwwroot/lib/bootstrap/dist/fonts/glyphicons-halflings-regular.woff2 (100%) rename samples/aspnet-mssql/{backend => app}/aspnetapp/wwwroot/lib/bootstrap/dist/js/bootstrap.js (100%) rename samples/aspnet-mssql/{backend => app}/aspnetapp/wwwroot/lib/bootstrap/dist/js/bootstrap.min.js (100%) rename samples/aspnet-mssql/{backend => app}/aspnetapp/wwwroot/lib/bootstrap/dist/js/npm.js (100%) rename samples/aspnet-mssql/{backend => app}/aspnetapp/wwwroot/lib/jquery-validation-unobtrusive/.bower.json (100%) rename samples/aspnet-mssql/{backend => app}/aspnetapp/wwwroot/lib/jquery-validation-unobtrusive/LICENSE.txt (100%) rename samples/aspnet-mssql/{backend => app}/aspnetapp/wwwroot/lib/jquery-validation-unobtrusive/jquery.validate.unobtrusive.js (100%) rename samples/aspnet-mssql/{backend => app}/aspnetapp/wwwroot/lib/jquery-validation-unobtrusive/jquery.validate.unobtrusive.min.js (100%) rename samples/aspnet-mssql/{backend => app}/aspnetapp/wwwroot/lib/jquery-validation/.bower.json (100%) rename samples/aspnet-mssql/{backend => app}/aspnetapp/wwwroot/lib/jquery-validation/LICENSE.md (100%) rename samples/aspnet-mssql/{backend => app}/aspnetapp/wwwroot/lib/jquery-validation/dist/additional-methods.js (100%) rename samples/aspnet-mssql/{backend => app}/aspnetapp/wwwroot/lib/jquery-validation/dist/additional-methods.min.js (100%) rename samples/aspnet-mssql/{backend => app}/aspnetapp/wwwroot/lib/jquery-validation/dist/jquery.validate.js (100%) rename samples/aspnet-mssql/{backend => app}/aspnetapp/wwwroot/lib/jquery-validation/dist/jquery.validate.min.js (100%) rename samples/aspnet-mssql/{backend => app}/aspnetapp/wwwroot/lib/jquery/.bower.json (100%) rename samples/aspnet-mssql/{backend => app}/aspnetapp/wwwroot/lib/jquery/LICENSE.txt (100%) rename samples/aspnet-mssql/{backend => app}/aspnetapp/wwwroot/lib/jquery/dist/jquery.js (100%) rename samples/aspnet-mssql/{backend => app}/aspnetapp/wwwroot/lib/jquery/dist/jquery.min.js (100%) rename samples/aspnet-mssql/{backend => app}/aspnetapp/wwwroot/lib/jquery/dist/jquery.min.map (100%) delete mode 100755 samples/aspnet-mssql/backend/Directory.Build.props delete mode 100755 samples/aspnet-mssql/backend/Dockerfile delete mode 100755 samples/aspnet-mssql/backend/Dockerfile.nanoserver-sac2016 delete mode 100755 samples/aspnet-mssql/backend/Dockerfile.preview delete mode 100755 samples/aspnet-mssql/backend/README.md delete mode 100755 samples/aspnet-mssql/backend/aspnet-docker-dev-in-container.md delete mode 100755 samples/aspnet-mssql/backend/aspnetapp/wwwroot/favicon.ico delete mode 100755 samples/aspnet-mssql/backend/aspnetcore-docker-arm32.md delete mode 100755 samples/aspnet-mssql/backend/aspnetcore-docker-https-development.md delete mode 100755 samples/aspnet-mssql/backend/aspnetcore-docker-https.md delete mode 100755 samples/aspnet-mssql/backend/aspnetcore-docker-windows.md delete mode 100755 samples/aspnet-mssql/backend/deploy-container-to-aci.md create mode 100644 samples/aspnet-mssql/output.jpg diff --git a/README.md b/README.md index 6058481..a1e45dd 100644 --- a/README.md +++ b/README.md @@ -32,7 +32,7 @@ docker-compose down *Samples of docker-compose applications with multiple integrated services:* -- [`Asp.NET/MS-SQL`](samples/aspnet-mysql/README.md) -- sample asp\\.net core application with MySQL database +- [`Asp.NET/MS-SQL`](samples/aspnet-mssql/README.md) -- sample asp\\.net core application with MS SQL server database - [`Flask / NGINX / MySQL`](samples/nginx-flask-mysql/README.md) -- sample Python/Flask application with an Nginx proxy and a MySQL database - [`Go / NGINX / MySQL`](samples/nginx-golang-mysql/README.md) -- sample Go application with an Nginx proxy and a MySQL database - [`Go / NGINX / PostgreSQL`](samples/nginx-golang-postgres/README.md) -- sample Go application with an Nginx proxy and a PostgreSQL database diff --git a/samples/angular/README.md b/samples/angular/README.md index fa812d4..57f4b46 100644 --- a/samples/angular/README.md +++ b/samples/angular/README.md @@ -8,17 +8,14 @@ Project structure: │   ├── ... │   ├── ... │   .... -│   -├── docker-compose.yaml -└── README.md - +└── docker-compose.yaml ``` _docker-compose.yaml_ ``` version: "3.7" services: - angular: + web: build: angular ports: - 80:4200 @@ -59,7 +56,7 @@ CONTAINER ID IMAGE COMMAND CREATED ``` -Open a browser and go to localhost. +After the application starts, navigate to `http://localhost:80` in your web browser. ![page](https://github.com/aiordache/awesome-compose/blob/master/samples/angular/output.jpg) diff --git a/samples/aspnet-mssql/README.md b/samples/aspnet-mssql/README.md new file mode 100644 index 0000000..9e304d6 --- /dev/null +++ b/samples/aspnet-mssql/README.md @@ -0,0 +1,68 @@ +## Compose sample - ASP.Net + +Project structure: +``` +. +├── app +│   ├── aspnetapp +│   │   ├── appsettings.Development.json +| | └── ... +│   ├── ... +│   └── Dockerfile +└── docker-compose.yaml +``` + +_docker-compose.yaml_ +``` +version: "3.7" +services: + web: + build: app + ports: + - 80:80 + ... +``` +The compose file defines an application with one service `web`. The image for the service is built with the Dockerfile inside the `app` directory (build parameter). + +When deploying the application, docker-compose maps the container port 80 to port 80 of the host as specified in the file. +Make sure port 80 on the host is not being used by another container, otherwise the port should be changed. + + +## Deploy with docker-compose + +``` +$ docker-compose up -d +$ compose up -d +Creating network "aspnet-mssql_default" with the default driver +Building web +Step 1/13 : FROM mcr.microsoft.com/dotnet/core/sdk:2.1 AS build +2.1: Pulling from dotnet/core/sdk +.... +.... +a9dca2f6722a: Pull complete +Digest: sha256:9b700672670bb3db4b212e8aef841ca79eb2fce7d5975a5ce35b7129a9b90ec0 +Status: Downloaded newer image for microsoft/mssql-server-linux:latest +Creating aspnet-mssql_web_1 ... done +Creating aspnet-mssql_db_1 ... done +``` + + +## Expected result + +Listing containers must show two containers running and the port mapping as below: +``` +$ docker ps +CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES +7f3a2a7ea5c0 microsoft/mssql-server-linux "/opt/mssql/bin/sqls…" 4 minutes ago Up 4 minutes 1433/tcp aspnet-mssql_db_1 +27342dde8b64 aspnet-mssql_web "dotnet aspnetapp.dll" 4 minutes ago Up 4 minutes 0.0.0.0:80->80/tcp aspnet-mssql_web_1 +``` + +After the application starts, navigate to `http://localhost:80` in your web browser. + +![page](https://github.com/aiordache/awesome-compose/blob/master/samples/aspnet-mssql/output.jpg) + +Stop and remove the container + +``` +$ docker-compose down +``` diff --git a/samples/aspnet-mssql/backend/Dockerfile.alpine-x64 b/samples/aspnet-mssql/app/Dockerfile similarity index 100% rename from samples/aspnet-mssql/backend/Dockerfile.alpine-x64 rename to samples/aspnet-mssql/app/Dockerfile diff --git a/samples/aspnet-mssql/backend/aspnetapp.sln b/samples/aspnet-mssql/app/aspnetapp.sln similarity index 100% rename from samples/aspnet-mssql/backend/aspnetapp.sln rename to samples/aspnet-mssql/app/aspnetapp.sln diff --git a/samples/aspnet-mssql/backend/aspnetapp/Controllers/HomeController.cs b/samples/aspnet-mssql/app/aspnetapp/Controllers/HomeController.cs similarity index 100% rename from samples/aspnet-mssql/backend/aspnetapp/Controllers/HomeController.cs rename to samples/aspnet-mssql/app/aspnetapp/Controllers/HomeController.cs diff --git a/samples/aspnet-mssql/backend/aspnetapp/Models/ErrorViewModel.cs b/samples/aspnet-mssql/app/aspnetapp/Models/ErrorViewModel.cs similarity index 100% rename from samples/aspnet-mssql/backend/aspnetapp/Models/ErrorViewModel.cs rename to samples/aspnet-mssql/app/aspnetapp/Models/ErrorViewModel.cs diff --git a/samples/aspnet-mssql/backend/aspnetapp/Program.cs b/samples/aspnet-mssql/app/aspnetapp/Program.cs similarity index 100% rename from samples/aspnet-mssql/backend/aspnetapp/Program.cs rename to samples/aspnet-mssql/app/aspnetapp/Program.cs diff --git a/samples/aspnet-mssql/backend/aspnetapp/Startup.cs b/samples/aspnet-mssql/app/aspnetapp/Startup.cs similarity index 100% rename from samples/aspnet-mssql/backend/aspnetapp/Startup.cs rename to samples/aspnet-mssql/app/aspnetapp/Startup.cs diff --git a/samples/aspnet-mssql/backend/aspnetapp/Views/Home/About.cshtml b/samples/aspnet-mssql/app/aspnetapp/Views/Home/About.cshtml similarity index 100% rename from samples/aspnet-mssql/backend/aspnetapp/Views/Home/About.cshtml rename to samples/aspnet-mssql/app/aspnetapp/Views/Home/About.cshtml diff --git a/samples/aspnet-mssql/backend/aspnetapp/Views/Home/Contact.cshtml b/samples/aspnet-mssql/app/aspnetapp/Views/Home/Contact.cshtml similarity index 100% rename from samples/aspnet-mssql/backend/aspnetapp/Views/Home/Contact.cshtml rename to samples/aspnet-mssql/app/aspnetapp/Views/Home/Contact.cshtml diff --git a/samples/aspnet-mssql/backend/aspnetapp/Views/Home/Index.cshtml b/samples/aspnet-mssql/app/aspnetapp/Views/Home/Index.cshtml similarity index 100% rename from samples/aspnet-mssql/backend/aspnetapp/Views/Home/Index.cshtml rename to samples/aspnet-mssql/app/aspnetapp/Views/Home/Index.cshtml diff --git a/samples/aspnet-mssql/backend/aspnetapp/Views/Home/Privacy.cshtml b/samples/aspnet-mssql/app/aspnetapp/Views/Home/Privacy.cshtml similarity index 100% rename from samples/aspnet-mssql/backend/aspnetapp/Views/Home/Privacy.cshtml rename to samples/aspnet-mssql/app/aspnetapp/Views/Home/Privacy.cshtml diff --git a/samples/aspnet-mssql/backend/aspnetapp/Views/Shared/Error.cshtml b/samples/aspnet-mssql/app/aspnetapp/Views/Shared/Error.cshtml similarity index 100% rename from samples/aspnet-mssql/backend/aspnetapp/Views/Shared/Error.cshtml rename to samples/aspnet-mssql/app/aspnetapp/Views/Shared/Error.cshtml diff --git a/samples/aspnet-mssql/backend/aspnetapp/Views/Shared/_CookieConsentPartial.cshtml b/samples/aspnet-mssql/app/aspnetapp/Views/Shared/_CookieConsentPartial.cshtml similarity index 100% rename from samples/aspnet-mssql/backend/aspnetapp/Views/Shared/_CookieConsentPartial.cshtml rename to samples/aspnet-mssql/app/aspnetapp/Views/Shared/_CookieConsentPartial.cshtml diff --git a/samples/aspnet-mssql/backend/aspnetapp/Views/Shared/_Layout.cshtml b/samples/aspnet-mssql/app/aspnetapp/Views/Shared/_Layout.cshtml similarity index 100% rename from samples/aspnet-mssql/backend/aspnetapp/Views/Shared/_Layout.cshtml rename to samples/aspnet-mssql/app/aspnetapp/Views/Shared/_Layout.cshtml diff --git a/samples/aspnet-mssql/backend/aspnetapp/Views/Shared/_ValidationScriptsPartial.cshtml b/samples/aspnet-mssql/app/aspnetapp/Views/Shared/_ValidationScriptsPartial.cshtml similarity index 100% rename from samples/aspnet-mssql/backend/aspnetapp/Views/Shared/_ValidationScriptsPartial.cshtml rename to samples/aspnet-mssql/app/aspnetapp/Views/Shared/_ValidationScriptsPartial.cshtml diff --git a/samples/aspnet-mssql/backend/aspnetapp/Views/_ViewImports.cshtml b/samples/aspnet-mssql/app/aspnetapp/Views/_ViewImports.cshtml similarity index 100% rename from samples/aspnet-mssql/backend/aspnetapp/Views/_ViewImports.cshtml rename to samples/aspnet-mssql/app/aspnetapp/Views/_ViewImports.cshtml diff --git a/samples/aspnet-mssql/backend/aspnetapp/Views/_ViewStart.cshtml b/samples/aspnet-mssql/app/aspnetapp/Views/_ViewStart.cshtml similarity index 100% rename from samples/aspnet-mssql/backend/aspnetapp/Views/_ViewStart.cshtml rename to samples/aspnet-mssql/app/aspnetapp/Views/_ViewStart.cshtml diff --git a/samples/aspnet-mssql/backend/aspnetapp/appsettings.Development.json b/samples/aspnet-mssql/app/aspnetapp/appsettings.Development.json similarity index 100% rename from samples/aspnet-mssql/backend/aspnetapp/appsettings.Development.json rename to samples/aspnet-mssql/app/aspnetapp/appsettings.Development.json diff --git a/samples/aspnet-mssql/backend/aspnetapp/appsettings.json b/samples/aspnet-mssql/app/aspnetapp/appsettings.json similarity index 100% rename from samples/aspnet-mssql/backend/aspnetapp/appsettings.json rename to samples/aspnet-mssql/app/aspnetapp/appsettings.json diff --git a/samples/aspnet-mssql/backend/aspnetapp/aspnetapp.csproj b/samples/aspnet-mssql/app/aspnetapp/aspnetapp.csproj similarity index 100% rename from samples/aspnet-mssql/backend/aspnetapp/aspnetapp.csproj rename to samples/aspnet-mssql/app/aspnetapp/aspnetapp.csproj diff --git a/samples/aspnet-mssql/backend/aspnetapp/wwwroot/css/site.css b/samples/aspnet-mssql/app/aspnetapp/wwwroot/css/site.css similarity index 100% rename from samples/aspnet-mssql/backend/aspnetapp/wwwroot/css/site.css rename to samples/aspnet-mssql/app/aspnetapp/wwwroot/css/site.css diff --git a/samples/aspnet-mssql/backend/aspnetapp/wwwroot/css/site.min.css b/samples/aspnet-mssql/app/aspnetapp/wwwroot/css/site.min.css similarity index 100% rename from samples/aspnet-mssql/backend/aspnetapp/wwwroot/css/site.min.css rename to samples/aspnet-mssql/app/aspnetapp/wwwroot/css/site.min.css diff --git a/samples/aspnet-mssql/app/aspnetapp/wwwroot/favicon.ico b/samples/aspnet-mssql/app/aspnetapp/wwwroot/favicon.ico new file mode 100755 index 0000000000000000000000000000000000000000..523925f7bd7c93c1e9f3acf1242ca4b65c3e448f GIT binary patch literal 3542 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 QF#rGn07*qoM6N<$f-gE^#{d8T literal 0 HcmV?d00001 diff --git a/samples/aspnet-mssql/backend/aspnetapp/wwwroot/images/banner1.svg b/samples/aspnet-mssql/app/aspnetapp/wwwroot/images/banner1.svg similarity index 100% rename from samples/aspnet-mssql/backend/aspnetapp/wwwroot/images/banner1.svg rename to samples/aspnet-mssql/app/aspnetapp/wwwroot/images/banner1.svg diff --git a/samples/aspnet-mssql/backend/aspnetapp/wwwroot/images/banner2.svg b/samples/aspnet-mssql/app/aspnetapp/wwwroot/images/banner2.svg similarity index 100% rename from samples/aspnet-mssql/backend/aspnetapp/wwwroot/images/banner2.svg rename to samples/aspnet-mssql/app/aspnetapp/wwwroot/images/banner2.svg diff --git a/samples/aspnet-mssql/backend/aspnetapp/wwwroot/images/banner3.svg b/samples/aspnet-mssql/app/aspnetapp/wwwroot/images/banner3.svg similarity index 100% rename from samples/aspnet-mssql/backend/aspnetapp/wwwroot/images/banner3.svg rename to samples/aspnet-mssql/app/aspnetapp/wwwroot/images/banner3.svg diff --git a/samples/aspnet-mssql/backend/aspnetapp/wwwroot/js/site.js b/samples/aspnet-mssql/app/aspnetapp/wwwroot/js/site.js similarity index 100% rename from samples/aspnet-mssql/backend/aspnetapp/wwwroot/js/site.js rename to samples/aspnet-mssql/app/aspnetapp/wwwroot/js/site.js diff --git a/samples/aspnet-mssql/backend/aspnetapp/wwwroot/js/site.min.js b/samples/aspnet-mssql/app/aspnetapp/wwwroot/js/site.min.js similarity index 100% rename from samples/aspnet-mssql/backend/aspnetapp/wwwroot/js/site.min.js rename to samples/aspnet-mssql/app/aspnetapp/wwwroot/js/site.min.js diff --git a/samples/aspnet-mssql/backend/aspnetapp/wwwroot/lib/bootstrap/.bower.json b/samples/aspnet-mssql/app/aspnetapp/wwwroot/lib/bootstrap/.bower.json similarity index 100% rename from samples/aspnet-mssql/backend/aspnetapp/wwwroot/lib/bootstrap/.bower.json rename to samples/aspnet-mssql/app/aspnetapp/wwwroot/lib/bootstrap/.bower.json diff --git a/samples/aspnet-mssql/backend/aspnetapp/wwwroot/lib/bootstrap/LICENSE b/samples/aspnet-mssql/app/aspnetapp/wwwroot/lib/bootstrap/LICENSE similarity index 100% rename from samples/aspnet-mssql/backend/aspnetapp/wwwroot/lib/bootstrap/LICENSE rename to samples/aspnet-mssql/app/aspnetapp/wwwroot/lib/bootstrap/LICENSE diff --git a/samples/aspnet-mssql/backend/aspnetapp/wwwroot/lib/bootstrap/dist/css/bootstrap-theme.css b/samples/aspnet-mssql/app/aspnetapp/wwwroot/lib/bootstrap/dist/css/bootstrap-theme.css similarity index 100% rename from samples/aspnet-mssql/backend/aspnetapp/wwwroot/lib/bootstrap/dist/css/bootstrap-theme.css rename to samples/aspnet-mssql/app/aspnetapp/wwwroot/lib/bootstrap/dist/css/bootstrap-theme.css diff --git a/samples/aspnet-mssql/backend/aspnetapp/wwwroot/lib/bootstrap/dist/css/bootstrap-theme.css.map b/samples/aspnet-mssql/app/aspnetapp/wwwroot/lib/bootstrap/dist/css/bootstrap-theme.css.map similarity index 100% rename from samples/aspnet-mssql/backend/aspnetapp/wwwroot/lib/bootstrap/dist/css/bootstrap-theme.css.map rename to samples/aspnet-mssql/app/aspnetapp/wwwroot/lib/bootstrap/dist/css/bootstrap-theme.css.map diff --git a/samples/aspnet-mssql/backend/aspnetapp/wwwroot/lib/bootstrap/dist/css/bootstrap-theme.min.css b/samples/aspnet-mssql/app/aspnetapp/wwwroot/lib/bootstrap/dist/css/bootstrap-theme.min.css similarity index 100% rename from samples/aspnet-mssql/backend/aspnetapp/wwwroot/lib/bootstrap/dist/css/bootstrap-theme.min.css rename to samples/aspnet-mssql/app/aspnetapp/wwwroot/lib/bootstrap/dist/css/bootstrap-theme.min.css diff --git a/samples/aspnet-mssql/backend/aspnetapp/wwwroot/lib/bootstrap/dist/css/bootstrap-theme.min.css.map b/samples/aspnet-mssql/app/aspnetapp/wwwroot/lib/bootstrap/dist/css/bootstrap-theme.min.css.map similarity index 100% rename from samples/aspnet-mssql/backend/aspnetapp/wwwroot/lib/bootstrap/dist/css/bootstrap-theme.min.css.map rename to samples/aspnet-mssql/app/aspnetapp/wwwroot/lib/bootstrap/dist/css/bootstrap-theme.min.css.map diff --git a/samples/aspnet-mssql/backend/aspnetapp/wwwroot/lib/bootstrap/dist/css/bootstrap.css b/samples/aspnet-mssql/app/aspnetapp/wwwroot/lib/bootstrap/dist/css/bootstrap.css similarity index 100% rename from samples/aspnet-mssql/backend/aspnetapp/wwwroot/lib/bootstrap/dist/css/bootstrap.css rename to samples/aspnet-mssql/app/aspnetapp/wwwroot/lib/bootstrap/dist/css/bootstrap.css diff --git a/samples/aspnet-mssql/backend/aspnetapp/wwwroot/lib/bootstrap/dist/css/bootstrap.css.map b/samples/aspnet-mssql/app/aspnetapp/wwwroot/lib/bootstrap/dist/css/bootstrap.css.map similarity index 100% rename from samples/aspnet-mssql/backend/aspnetapp/wwwroot/lib/bootstrap/dist/css/bootstrap.css.map rename to samples/aspnet-mssql/app/aspnetapp/wwwroot/lib/bootstrap/dist/css/bootstrap.css.map diff --git a/samples/aspnet-mssql/backend/aspnetapp/wwwroot/lib/bootstrap/dist/css/bootstrap.min.css b/samples/aspnet-mssql/app/aspnetapp/wwwroot/lib/bootstrap/dist/css/bootstrap.min.css similarity index 100% rename from samples/aspnet-mssql/backend/aspnetapp/wwwroot/lib/bootstrap/dist/css/bootstrap.min.css rename to samples/aspnet-mssql/app/aspnetapp/wwwroot/lib/bootstrap/dist/css/bootstrap.min.css diff --git a/samples/aspnet-mssql/backend/aspnetapp/wwwroot/lib/bootstrap/dist/css/bootstrap.min.css.map b/samples/aspnet-mssql/app/aspnetapp/wwwroot/lib/bootstrap/dist/css/bootstrap.min.css.map similarity index 100% rename from samples/aspnet-mssql/backend/aspnetapp/wwwroot/lib/bootstrap/dist/css/bootstrap.min.css.map rename to samples/aspnet-mssql/app/aspnetapp/wwwroot/lib/bootstrap/dist/css/bootstrap.min.css.map diff --git a/samples/aspnet-mssql/backend/aspnetapp/wwwroot/lib/bootstrap/dist/fonts/glyphicons-halflings-regular.eot b/samples/aspnet-mssql/app/aspnetapp/wwwroot/lib/bootstrap/dist/fonts/glyphicons-halflings-regular.eot similarity index 100% rename from samples/aspnet-mssql/backend/aspnetapp/wwwroot/lib/bootstrap/dist/fonts/glyphicons-halflings-regular.eot rename to samples/aspnet-mssql/app/aspnetapp/wwwroot/lib/bootstrap/dist/fonts/glyphicons-halflings-regular.eot diff --git a/samples/aspnet-mssql/backend/aspnetapp/wwwroot/lib/bootstrap/dist/fonts/glyphicons-halflings-regular.svg b/samples/aspnet-mssql/app/aspnetapp/wwwroot/lib/bootstrap/dist/fonts/glyphicons-halflings-regular.svg similarity index 100% rename from samples/aspnet-mssql/backend/aspnetapp/wwwroot/lib/bootstrap/dist/fonts/glyphicons-halflings-regular.svg rename to samples/aspnet-mssql/app/aspnetapp/wwwroot/lib/bootstrap/dist/fonts/glyphicons-halflings-regular.svg diff --git a/samples/aspnet-mssql/backend/aspnetapp/wwwroot/lib/bootstrap/dist/fonts/glyphicons-halflings-regular.ttf b/samples/aspnet-mssql/app/aspnetapp/wwwroot/lib/bootstrap/dist/fonts/glyphicons-halflings-regular.ttf similarity index 100% rename from samples/aspnet-mssql/backend/aspnetapp/wwwroot/lib/bootstrap/dist/fonts/glyphicons-halflings-regular.ttf rename to samples/aspnet-mssql/app/aspnetapp/wwwroot/lib/bootstrap/dist/fonts/glyphicons-halflings-regular.ttf diff --git a/samples/aspnet-mssql/backend/aspnetapp/wwwroot/lib/bootstrap/dist/fonts/glyphicons-halflings-regular.woff b/samples/aspnet-mssql/app/aspnetapp/wwwroot/lib/bootstrap/dist/fonts/glyphicons-halflings-regular.woff similarity index 100% rename from samples/aspnet-mssql/backend/aspnetapp/wwwroot/lib/bootstrap/dist/fonts/glyphicons-halflings-regular.woff rename to samples/aspnet-mssql/app/aspnetapp/wwwroot/lib/bootstrap/dist/fonts/glyphicons-halflings-regular.woff diff --git a/samples/aspnet-mssql/backend/aspnetapp/wwwroot/lib/bootstrap/dist/fonts/glyphicons-halflings-regular.woff2 b/samples/aspnet-mssql/app/aspnetapp/wwwroot/lib/bootstrap/dist/fonts/glyphicons-halflings-regular.woff2 similarity index 100% rename from samples/aspnet-mssql/backend/aspnetapp/wwwroot/lib/bootstrap/dist/fonts/glyphicons-halflings-regular.woff2 rename to samples/aspnet-mssql/app/aspnetapp/wwwroot/lib/bootstrap/dist/fonts/glyphicons-halflings-regular.woff2 diff --git a/samples/aspnet-mssql/backend/aspnetapp/wwwroot/lib/bootstrap/dist/js/bootstrap.js b/samples/aspnet-mssql/app/aspnetapp/wwwroot/lib/bootstrap/dist/js/bootstrap.js similarity index 100% rename from samples/aspnet-mssql/backend/aspnetapp/wwwroot/lib/bootstrap/dist/js/bootstrap.js rename to samples/aspnet-mssql/app/aspnetapp/wwwroot/lib/bootstrap/dist/js/bootstrap.js diff --git a/samples/aspnet-mssql/backend/aspnetapp/wwwroot/lib/bootstrap/dist/js/bootstrap.min.js b/samples/aspnet-mssql/app/aspnetapp/wwwroot/lib/bootstrap/dist/js/bootstrap.min.js similarity index 100% rename from samples/aspnet-mssql/backend/aspnetapp/wwwroot/lib/bootstrap/dist/js/bootstrap.min.js rename to samples/aspnet-mssql/app/aspnetapp/wwwroot/lib/bootstrap/dist/js/bootstrap.min.js diff --git a/samples/aspnet-mssql/backend/aspnetapp/wwwroot/lib/bootstrap/dist/js/npm.js b/samples/aspnet-mssql/app/aspnetapp/wwwroot/lib/bootstrap/dist/js/npm.js similarity index 100% rename from samples/aspnet-mssql/backend/aspnetapp/wwwroot/lib/bootstrap/dist/js/npm.js rename to samples/aspnet-mssql/app/aspnetapp/wwwroot/lib/bootstrap/dist/js/npm.js diff --git a/samples/aspnet-mssql/backend/aspnetapp/wwwroot/lib/jquery-validation-unobtrusive/.bower.json b/samples/aspnet-mssql/app/aspnetapp/wwwroot/lib/jquery-validation-unobtrusive/.bower.json similarity index 100% rename from samples/aspnet-mssql/backend/aspnetapp/wwwroot/lib/jquery-validation-unobtrusive/.bower.json rename to samples/aspnet-mssql/app/aspnetapp/wwwroot/lib/jquery-validation-unobtrusive/.bower.json diff --git a/samples/aspnet-mssql/backend/aspnetapp/wwwroot/lib/jquery-validation-unobtrusive/LICENSE.txt b/samples/aspnet-mssql/app/aspnetapp/wwwroot/lib/jquery-validation-unobtrusive/LICENSE.txt similarity index 100% rename from samples/aspnet-mssql/backend/aspnetapp/wwwroot/lib/jquery-validation-unobtrusive/LICENSE.txt rename to samples/aspnet-mssql/app/aspnetapp/wwwroot/lib/jquery-validation-unobtrusive/LICENSE.txt diff --git a/samples/aspnet-mssql/backend/aspnetapp/wwwroot/lib/jquery-validation-unobtrusive/jquery.validate.unobtrusive.js b/samples/aspnet-mssql/app/aspnetapp/wwwroot/lib/jquery-validation-unobtrusive/jquery.validate.unobtrusive.js similarity index 100% rename from samples/aspnet-mssql/backend/aspnetapp/wwwroot/lib/jquery-validation-unobtrusive/jquery.validate.unobtrusive.js rename to samples/aspnet-mssql/app/aspnetapp/wwwroot/lib/jquery-validation-unobtrusive/jquery.validate.unobtrusive.js diff --git a/samples/aspnet-mssql/backend/aspnetapp/wwwroot/lib/jquery-validation-unobtrusive/jquery.validate.unobtrusive.min.js b/samples/aspnet-mssql/app/aspnetapp/wwwroot/lib/jquery-validation-unobtrusive/jquery.validate.unobtrusive.min.js similarity index 100% rename from samples/aspnet-mssql/backend/aspnetapp/wwwroot/lib/jquery-validation-unobtrusive/jquery.validate.unobtrusive.min.js rename to samples/aspnet-mssql/app/aspnetapp/wwwroot/lib/jquery-validation-unobtrusive/jquery.validate.unobtrusive.min.js diff --git a/samples/aspnet-mssql/backend/aspnetapp/wwwroot/lib/jquery-validation/.bower.json b/samples/aspnet-mssql/app/aspnetapp/wwwroot/lib/jquery-validation/.bower.json similarity index 100% rename from samples/aspnet-mssql/backend/aspnetapp/wwwroot/lib/jquery-validation/.bower.json rename to samples/aspnet-mssql/app/aspnetapp/wwwroot/lib/jquery-validation/.bower.json diff --git a/samples/aspnet-mssql/backend/aspnetapp/wwwroot/lib/jquery-validation/LICENSE.md b/samples/aspnet-mssql/app/aspnetapp/wwwroot/lib/jquery-validation/LICENSE.md similarity index 100% rename from samples/aspnet-mssql/backend/aspnetapp/wwwroot/lib/jquery-validation/LICENSE.md rename to samples/aspnet-mssql/app/aspnetapp/wwwroot/lib/jquery-validation/LICENSE.md diff --git a/samples/aspnet-mssql/backend/aspnetapp/wwwroot/lib/jquery-validation/dist/additional-methods.js b/samples/aspnet-mssql/app/aspnetapp/wwwroot/lib/jquery-validation/dist/additional-methods.js similarity index 100% rename from samples/aspnet-mssql/backend/aspnetapp/wwwroot/lib/jquery-validation/dist/additional-methods.js rename to samples/aspnet-mssql/app/aspnetapp/wwwroot/lib/jquery-validation/dist/additional-methods.js diff --git a/samples/aspnet-mssql/backend/aspnetapp/wwwroot/lib/jquery-validation/dist/additional-methods.min.js b/samples/aspnet-mssql/app/aspnetapp/wwwroot/lib/jquery-validation/dist/additional-methods.min.js similarity index 100% rename from samples/aspnet-mssql/backend/aspnetapp/wwwroot/lib/jquery-validation/dist/additional-methods.min.js rename to samples/aspnet-mssql/app/aspnetapp/wwwroot/lib/jquery-validation/dist/additional-methods.min.js diff --git a/samples/aspnet-mssql/backend/aspnetapp/wwwroot/lib/jquery-validation/dist/jquery.validate.js b/samples/aspnet-mssql/app/aspnetapp/wwwroot/lib/jquery-validation/dist/jquery.validate.js similarity index 100% rename from samples/aspnet-mssql/backend/aspnetapp/wwwroot/lib/jquery-validation/dist/jquery.validate.js rename to samples/aspnet-mssql/app/aspnetapp/wwwroot/lib/jquery-validation/dist/jquery.validate.js diff --git a/samples/aspnet-mssql/backend/aspnetapp/wwwroot/lib/jquery-validation/dist/jquery.validate.min.js b/samples/aspnet-mssql/app/aspnetapp/wwwroot/lib/jquery-validation/dist/jquery.validate.min.js similarity index 100% rename from samples/aspnet-mssql/backend/aspnetapp/wwwroot/lib/jquery-validation/dist/jquery.validate.min.js rename to samples/aspnet-mssql/app/aspnetapp/wwwroot/lib/jquery-validation/dist/jquery.validate.min.js diff --git a/samples/aspnet-mssql/backend/aspnetapp/wwwroot/lib/jquery/.bower.json b/samples/aspnet-mssql/app/aspnetapp/wwwroot/lib/jquery/.bower.json similarity index 100% rename from samples/aspnet-mssql/backend/aspnetapp/wwwroot/lib/jquery/.bower.json rename to samples/aspnet-mssql/app/aspnetapp/wwwroot/lib/jquery/.bower.json diff --git a/samples/aspnet-mssql/backend/aspnetapp/wwwroot/lib/jquery/LICENSE.txt b/samples/aspnet-mssql/app/aspnetapp/wwwroot/lib/jquery/LICENSE.txt similarity index 100% rename from samples/aspnet-mssql/backend/aspnetapp/wwwroot/lib/jquery/LICENSE.txt rename to samples/aspnet-mssql/app/aspnetapp/wwwroot/lib/jquery/LICENSE.txt diff --git a/samples/aspnet-mssql/backend/aspnetapp/wwwroot/lib/jquery/dist/jquery.js b/samples/aspnet-mssql/app/aspnetapp/wwwroot/lib/jquery/dist/jquery.js similarity index 100% rename from samples/aspnet-mssql/backend/aspnetapp/wwwroot/lib/jquery/dist/jquery.js rename to samples/aspnet-mssql/app/aspnetapp/wwwroot/lib/jquery/dist/jquery.js diff --git a/samples/aspnet-mssql/backend/aspnetapp/wwwroot/lib/jquery/dist/jquery.min.js b/samples/aspnet-mssql/app/aspnetapp/wwwroot/lib/jquery/dist/jquery.min.js similarity index 100% rename from samples/aspnet-mssql/backend/aspnetapp/wwwroot/lib/jquery/dist/jquery.min.js rename to samples/aspnet-mssql/app/aspnetapp/wwwroot/lib/jquery/dist/jquery.min.js diff --git a/samples/aspnet-mssql/backend/aspnetapp/wwwroot/lib/jquery/dist/jquery.min.map b/samples/aspnet-mssql/app/aspnetapp/wwwroot/lib/jquery/dist/jquery.min.map similarity index 100% rename from samples/aspnet-mssql/backend/aspnetapp/wwwroot/lib/jquery/dist/jquery.min.map rename to samples/aspnet-mssql/app/aspnetapp/wwwroot/lib/jquery/dist/jquery.min.map diff --git a/samples/aspnet-mssql/backend/Directory.Build.props b/samples/aspnet-mssql/backend/Directory.Build.props deleted file mode 100755 index fc3ed9e..0000000 --- a/samples/aspnet-mssql/backend/Directory.Build.props +++ /dev/null @@ -1,18 +0,0 @@ - - - - $(DefaultItemExcludes);$(MSBuildProjectDirectory)/obj/**/* - $(DefaultItemExcludes);$(MSBuildProjectDirectory)/bin/**/* - - - - $(MSBuildProjectDirectory)/obj/container/ - $(MSBuildProjectDirectory)/bin/container/ - - - - $(MSBuildProjectDirectory)/obj/local/ - $(MSBuildProjectDirectory)/bin/local/ - - - \ No newline at end of file diff --git a/samples/aspnet-mssql/backend/Dockerfile b/samples/aspnet-mssql/backend/Dockerfile deleted file mode 100755 index 00cd43e..0000000 --- a/samples/aspnet-mssql/backend/Dockerfile +++ /dev/null @@ -1,19 +0,0 @@ -FROM mcr.microsoft.com/dotnet/core/sdk:2.1 AS build -WORKDIR /app - -# copy csproj and restore as distinct layers -COPY *.sln . -COPY aspnetapp/*.csproj ./aspnetapp/ -RUN dotnet restore - -# copy everything else and build app -COPY aspnetapp/. ./aspnetapp/ -WORKDIR /app/aspnetapp -RUN dotnet publish -c Release -o out - - -FROM mcr.microsoft.com/dotnet/core/aspnet:2.1 AS runtime -EXPOSE 80 -WORKDIR /app -COPY --from=build /app/aspnetapp/out ./ -ENTRYPOINT ["dotnet", "aspnetapp.dll"] diff --git a/samples/aspnet-mssql/backend/Dockerfile.nanoserver-sac2016 b/samples/aspnet-mssql/backend/Dockerfile.nanoserver-sac2016 deleted file mode 100755 index 9d74651..0000000 --- a/samples/aspnet-mssql/backend/Dockerfile.nanoserver-sac2016 +++ /dev/null @@ -1,18 +0,0 @@ -FROM mcr.microsoft.com/dotnet/core/sdk:2.1 AS build -WORKDIR /app - -# copy csproj and restore as distinct layers -COPY *.sln . -COPY aspnetapp/*.csproj ./aspnetapp/ -RUN dotnet restore - -# copy everything else and build app -COPY aspnetapp/. ./aspnetapp/ -WORKDIR /app/aspnetapp -RUN dotnet publish -c Release -o out - - -FROM mcr.microsoft.com/dotnet/core/aspnet:2.1 AS runtime -WORKDIR /app -COPY --from=build /app/aspnetapp/out ./ -ENTRYPOINT ["dotnet", "aspnetapp.dll"] diff --git a/samples/aspnet-mssql/backend/Dockerfile.preview b/samples/aspnet-mssql/backend/Dockerfile.preview deleted file mode 100755 index b0d1bc4..0000000 --- a/samples/aspnet-mssql/backend/Dockerfile.preview +++ /dev/null @@ -1,19 +0,0 @@ -# This Dockerfile uses nightly preview builds for .NET Core -FROM mcr.microsoft.com/dotnet/core/sdk:2.2 AS build -WORKDIR /app - -# copy csproj and restore as distinct layers -COPY *.sln . -COPY aspnetapp/*.csproj ./aspnetapp/ -RUN dotnet restore - -# copy everything else and build app -COPY aspnetapp/. ./aspnetapp/ -WORKDIR /app/aspnetapp -RUN dotnet publish -c Release -o out - - -FROM mcr.microsoft.com/dotnet/core/aspnet:2.2 AS runtime -WORKDIR /app -COPY --from=build /app/aspnetapp/out ./ -ENTRYPOINT ["dotnet", "aspnetapp.dll"] diff --git a/samples/aspnet-mssql/backend/README.md b/samples/aspnet-mssql/backend/README.md deleted file mode 100755 index ebf2a6e..0000000 --- a/samples/aspnet-mssql/backend/README.md +++ /dev/null @@ -1,163 +0,0 @@ -# ASP.NET Core Docker Sample - -This [sample Dockerfile](Dockerfile) demonstrates how to use ASP.NET Core and Docker together. The sample works with both Linux and Windows containers and can also be used without Docker. There are also instructions that demonstrate how to push the sample to [Azure Container Registry](../dotnetapp/push-image-to-acr.md) and test it with [Azure Container Instance](deploy-container-to-aci.md). You can [configure ASP.NET Core to use HTTPS with Docker](aspnetcore-docker-https.md). - -The sample builds the application in a container based on the larger [.NET Core SDK Docker image](https://hub.docker.com/r/microsoft/dotnet/). It builds the application and then copies the final build result into a Docker image based on the smaller [ASP.NET Core Docker Runtime image](https://hub.docker.com/r/microsoft/aspnetcore/). - -This sample requires [Docker 17.06](https://docs.docker.com/release-notes/docker-ce) or later of the [Docker client](https://www.docker.com/products/docker). - -## Try a pre-built ASP.NET Core Docker Image - -You can quickly run a container with a pre-built [sample ASP.NET Core Docker image](https://hub.docker.com/r/microsoft/dotnet-samples/), based on this [sample](Dockerfile). - -Type the following command to run a sample with [Docker](https://www.docker.com/products/docker): - -```console -docker run --name aspnetcore_sample --rm -it -p 8000:80 microsoft/dotnet-samples:aspnetapp -``` - -After the application starts, navigate to `http://localhost:8000` in your web browser. On Windows, you may need to navigate to the container via IP address. See [ASP.NET Core apps in Windows Containers](aspnetcore-docker-windows.md) for instructions on determining the IP address, using the value of `--name` that you used in `docker run`. - -See [Hosting ASP.NET Core Images with Docker over HTTPS](aspnetcore-docker-https.md) to use HTTPS with this image. - -## Getting the sample - -The easiest way to get the sample is by cloning the samples repository with git, using the following instructions: - -```console -git clone https://github.com/dotnet/dotnet-docker/ -``` - -You can also [download the repository as a zip](https://github.com/dotnet/dotnet-docker/archive/master.zip). - -## Build and run the sample with Docker - -You can build and run the sample in Docker using the following commands. The instructions assume that you are in the root of the repository. - -```console -cd samples -cd aspnetapp -docker build --pull -t aspnetapp . -docker run --name aspnetcore_sample --rm -it -p 8000:80 aspnetapp -``` - -You should see the following console output as the application starts. - -```console -C:\git\dotnet-docker\samples\aspnetapp>docker run --name aspnetcore_sample --rm -it -p 8000:80 aspnetapp -Hosting environment: Production -Content root path: /app -Now listening on: http://[::]:80 -Application started. Press Ctrl+C to shut down. -``` - -After the application starts, navigate to `http://localhost:8000` in your web browser. On Windows, you may need to navigate to the container via IP address. See [ASP.NET Core apps in Windows Containers](aspnetcore-docker-windows.md) for instructions on determining the IP address, using the value of `--name` that you used in `docker run`. - -> Note: The `-p` argument maps port 8000 on your local machine to port 80 in the container (the form of the port mapping is `host:container`). See the [Docker run reference](https://docs.docker.com/engine/reference/commandline/run/) for more information on commandline parameters. In some cases, you might see an error because the host port you select is already in use. Choose a different port in that case. - -## Additional Samples - -Multiple variations of this sample have been provided, as follows. Some of these example Dockerfiles are demonstrated later. Specify an alternate Dockerfile via the `-f` argument. - -* [Multi-arch sample](Dockerfile) -* [Multi-arch sample, using a preview version of .NET Core](Dockerfile.preview) -* [Nanoserver 2016 SAC sample](Dockerfile.nanoserver-sac2016) -* [Alpine sample](Dockerfile.alpine-x64) - -## Deploying with HTTPS - -ASP.NET Core 2.1 uses [HTTPS by default](https://docs.microsoft.com/en-us/aspnet/core/security/enforcing-ssl). You can [configure ASP.NET Core to use HTTPS with Docker](aspnetcore-docker-https.md). - -## Build and run the sample for Alpine X64 with Docker - -You can build and run the sample for Alpine using the following instructions. Make sure Docker is set to Linux containers if you are on Windows. - -```console -cd samples -cd aspnetapp -docker build --pull -t aspnetapp -f Dockerfile.alpine-x64 . -docker run --name aspnetcore_sample --rm -it -p 8000:80 aspnetapp -``` - -After the application starts, navigate to `http://localhost:8000` in your web browser. - -## Build and run the sample for Ubuntu 18.04 with Docker - -You can also build for [Ubuntu 18.04](https://hub.docker.com/_/ubuntu/), with a `bionic` tag. The `bionic` tags are documented at [microsoft/dotnet](https://hub.docker.com/r/microsoft/dotnet/). You would switch to the following tags: - -* SDK: 2.1-sdk-bionic -* Runtime:-2.1-aspnetcore-runtime-bionic - -## Build and run the sample for Linux ARM32 with Docker - -You can build and run the sample for ARM32 and Raspberry Pi with [Build ASP.NET Core Applications for Raspberry Pi with Docker](aspnetcore-docker-arm32.md) instructions. - -## Develop ASP.NET Core Applications in a container - -You can develop applications without a .NET Core installation on your machine with the [Develop ASP.NET Core applications in a container](aspnet-docker-dev-in-container.md) instructions. These instructions are also useful if your development and production environments do not match. - -## Deploying to Production vs Development - -The approach for running containers differs between development and production. - -In production, you will typically start your container with `docker run -d`. This argument starts the container as a service, without any console interaction. You then interact with it through other Docker commands or APIs exposed by the containerized application. - -In development, you will typically start containers with `docker run --rm -it`. These arguments enable you to see a console (important when there are errors), terminate the container with `CTRL-C` and cleans up all container resources when the container is termiantes. You also typically don't mind blocking the console. This approach is demonstrated in prior examples in this document. - -We recommend that you do not use `--rm` in production. It cleans up container resources, preventing you from collecting logs that may have been captured in a container that has either stopped or crashed. - -## Build and run the sample locally - -You can build and run the sample locally with the [.NET Core 2.1 SDK](https://www.microsoft.com/net/download/core) using the following commands. The commands assume that you are in the root of the repository. - -```console -cd samples -cd aspnetapp -dotnet run -``` - -After the application starts, visit `http://localhost:5000` in your web browser. - -You can produce an application that is ready to deploy to production locally using the following command. - -```console -dotnet publish -c Release -o out -``` - -You can run the application using the following commands. - -```console -cd out -dotnet aspnetapp.dll -``` - -Note: The `-c Release` argument builds the application in release mode (the default is debug mode). See the [dotnet publish reference](https://docs.microsoft.com/dotnet/core/tools/dotnet-publish) for more information on commandline parameters. - -## .NET Core Resources - -More Samples - -* [.NET Core Docker Samples](../README.md) -* [.NET Framework Docker Samples](https://github.com/microsoft/dotnet-framework-docker/blob/master/samples/README.md) - -Docs and More Information: - -* [.NET Docs](https://docs.microsoft.com/dotnet/) -* [ASP.NET Docs](https://docs.microsoft.com/aspnet/) -* [dotnet/core](https://github.com/dotnet/core) for starting with .NET Core on GitHub. -* [dotnet/announcements](https://github.com/dotnet/announcements/issues) for .NET announcements. - -## Related Repositories - -.NET Core Docker Hub repos: - -* [microsoft/aspnetcore](https://hub.docker.com/r/microsoft/aspnetcore/) for ASP.NET Core images. -* [microsoft/dotnet](https://hub.docker.com/r/microsoft/dotnet/) for .NET Core images. -* [microsoft/dotnet-nightly](https://hub.docker.com/r/microsoft/dotnet-nightly/) for .NET Core preview images. -* [microsoft/dotnet-samples](https://hub.docker.com/r/microsoft/dotnet-samples/) for .NET Core sample images. - -.NET Framework Docker Hub repos: - -* [microsoft/aspnet](https://hub.docker.com/r/microsoft/aspnet/) for ASP.NET Web Forms and MVC images. -* [microsoft/dotnet-framework](https://hub.docker.com/r/microsoft/dotnet-framework/) for .NET Framework images. -* [microsoft/dotnet-framework-samples](https://hub.docker.com/r/microsoft/dotnet-framework-samples/) for .NET Framework and ASP.NET sample images. diff --git a/samples/aspnet-mssql/backend/aspnet-docker-dev-in-container.md b/samples/aspnet-mssql/backend/aspnet-docker-dev-in-container.md deleted file mode 100755 index 1f526ec..0000000 --- a/samples/aspnet-mssql/backend/aspnet-docker-dev-in-container.md +++ /dev/null @@ -1,68 +0,0 @@ -# Develop ASP.NET Core Applications in a Container - -You can use containers to establish a .NET Core development environment with only Docker and optionally a code editor installed on your machine. The environment can be made to match your local machine, production or both. If you support multiple operating systems, then this approach might become a key part of your development process. - -A common use case of Docker is to [containerize an application](README.md). You can define the environment necessary to run the application and even build the application itself within a Dockerfile. This document describes a much more iterative and dynamic use of Docker, defining the container environment primarily via the commandline. .NET Core includes a command called `dotnet watch` that can rerun your application or your tests on each code change. This document describes how to use the Docker CLI and `dotnet watch` to develop applications in a container. - -See [Develop .NET Core Applications in a Container](../dotnetapp/dotnet-docker-dev-in-container.md) for .NET Core-specific instructions. - -## Getting the sample - -The easiest way to get the sample is by cloning the samples repository with [git](https://git-scm.com/downloads), using the following instructions: - -```console -git clone https://github.com/dotnet/dotnet-docker/ -``` - -You can also [download the repository as a zip](https://github.com/dotnet/dotnet-docker/archive/master.zip). - -## Requirements - -It is recommended that you add a [Directory.Build.props](Directory.Build.props) file to your project to use different `obj` and `bin` folders for local and container use, to avoid conflicts between them. You should delete your existing obj and bin folders before making this change. You can also use `dotnet clean` for this purpose. - -This approach relies on [volume mounting](https://docs.docker.com/engine/admin/volumes/volumes/) (that's the `-v` argument in the following commands) to mount source into the container (without using a Dockerfile). You may need to [Enable shared drives (Windows)](https://docs.docker.com/docker-for-windows/#shared-drives) or [file sharing (macOS)](https://docs.docker.com/docker-for-mac/#file-sharing) first. - -## Run your application in a container while you Develop - -You can re-run your application in a container with every local code change. This scenario works for both console applications and websites. The syntax differs a bit for Windows and Linux containers. - -The instructions assume that you are in the root of the repository. You can use the following commands, given your environment: - -### Windows using Linux containers - -```console -docker run --rm -it -p 8000:80 -v c:\git\dotnet-docker\samples\aspnetapp:/app/ -w /app/aspnetapp microsoft/dotnet:2.1-sdk dotnet watch run -``` - -You can use CTRL-C to terminate `dotnet watch`. Navigate to the site at `http://localhost:8000` in your browser. - -### macOS or Linux using Linux containers - -```console -docker run --rm -it -p 8000:80 -v ~/git/dotnet-docker/samples/aspnetapp:/app/ -w /app/aspnetapp microsoft/dotnet:2.1-sdk dotnet watch run -``` - -You can use CTRL-C to terminate `dotnet watch`. Navigate to the site at `http://localhost:8000` in your browser. - -### Windows using Windows containers - -```console -docker run --rm -it -p 8000:80 -v c:\git\dotnet-docker\samples\aspnetapp:c:\app\ -w \app\aspnetapp --name aspnetappsample microsoft/dotnet:2.1-sdk dotnet watch run -``` - -You can use CTRL-C to terminate `dotnet watch`. - -After the application starts, navigate to `http://localhost:8000` in your web browser. On Windows, you may need to navigate to the container via IP address. See [ASP.NET Core apps in Windows Containers](aspnetcore-docker-windows.md) for instructions on determining the IP address, using the value of `--name` that you used in `docker run`. - -## Updating the site while the container is running - -You can demo a relaunch of the site by changing the About controller method in `HomeController.cs`, waiting a few seconds for the site to recompile and then visit `http://localhost:8000/Home/About` - -## Test your application in a container while you develop - -You can retest your application in a container with every local code change. You can see this demonstrated in [Develop .NET Core Applications in a Container](../dotnetapp/dotnet-docker-dev-in-container.md). - -## More Samples - -* [.NET Core Docker Samples](../README.md) -* [.NET Framework Docker Samples](https://github.com/microsoft/dotnet-framework-docker-samples/) diff --git a/samples/aspnet-mssql/backend/aspnetapp/wwwroot/favicon.ico b/samples/aspnet-mssql/backend/aspnetapp/wwwroot/favicon.ico deleted file mode 100755 index a3a799985c43bc7309d701b2cad129023377dc71..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 32038 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 Note: that Docker refers to ARM32 as `armhf` in documentation and other places. - -See [Use .NET Core on Linux ARM32 with Docker](../dotnetapp/aspnetcore-docker-arm32.md) for .NET Core console apps. - -See [.NET Core and Docker for ARM64](dotnet-docker-arm64.md) if you are interested in [ARM64](https://en.wikipedia.org/wiki/ARM64) usage. - -## Try a pre-built ASP.NET Core Docker Image - -You can quickly run a container with a pre-built [sample ASP.NET Core Docker image](https://hub.docker.com/r/microsoft/dotnet-samples/), based on this [sample](Dockerfile.preview). - -Type the following command to run a sample with [Docker](https://www.docker.com/products/docker): - -```console -docker run --rm -it -p 8000:80 microsoft/dotnet-samples:aspnetapp -``` - -After the application starts, navigate to `http://localhost:8000` in your web browser and/or to the IP address (example: http://192.168.1.18:8000) of your ARM32 device on your network. - -## Building .NET Core Samples with Docker - -You can build the same [.NET Core console samples](README.md) and [ASP.NET Core sample](../aspnetapp/README.md) on ARM devices as you can on other architectures. For example, the following instructions will work on an ARM32 device. The instructions assume that you are in the root of this repository. - -```console -cd samples -cd aspnetapp -docker build --pull -t aspnetapp . -docker run --rm -it -p 8000:80 aspnetapp -``` - -Another option is to build ARM32 Docker images on an X64 machine. You can do by using the same pattern used in the [Dockerfile.debian-arm32-selfcontained](../dotnetapp/Dockerfile.debian-arm32-selfcontained) dockerfile. It uses a multi-arch tag for building with the SDK and then an ARM32-specific tag for creating a runtime image. The pattern of building for other architectures only works because the Dockerfile doesn't run code in the runtime image. - -### Viewing the Site - -After the application starts, visit the site one of two ways: - -* From the web browser on the ARM32 device at `http://localhost:8000` -* From the web browser on another device on the same network on the ARM32 device IP on port 8000, similar to: `http://192.168.1.18:8000` - -You must set the `ASPNETCORE_URLS` environment variable manually ([example usage](https://github.com/dotnet/dotnet-docker/blob/master/2.1/runtime-deps/stretch-slim/arm32v7/Dockerfile#L19)) if you build the sample locally (without Docker) and want to navigate to the site from another machine. - -## Pushing the image to a Container Registry - -Push the image to a container registry after building the image so that you can pull it from another ARM32 device. You can also build an ARM32 image on an X64 machine, push to a registry and then pull from an ARM32 device. Instructions are provided for pushing to both Azure Container Registry and DockerHub (you only need to choose one): - -* [Push Docker Images to Azure Container Registry](push-image-to-acr.md) -* [Push Docker Images to DockerHub](push-image-to-dockerhub.md) - -## More Samples - -* [.NET Core Docker Samples](../README.md) -* [.NET Framework Docker Samples](https://github.com/microsoft/dotnet-framework-docker-samples/) diff --git a/samples/aspnet-mssql/backend/aspnetcore-docker-https-development.md b/samples/aspnet-mssql/backend/aspnetcore-docker-https-development.md deleted file mode 100755 index f30564d..0000000 --- a/samples/aspnet-mssql/backend/aspnetcore-docker-https-development.md +++ /dev/null @@ -1,210 +0,0 @@ -# Developing ASP.NET Core Applications with Docker over HTTPS - -ASP.NET Core 2.1 uses [HTTPS by default](https://docs.microsoft.com/aspnet/core/security/enforcing-ssl). [HTTPS](https://en.wikipedia.org/wiki/HTTPS) relies on [certificates](https://en.wikipedia.org/wiki/Public_key_certificate) for trust, identity, and encryption. - -This document demonstrates how to develop ASP.NET Core applications with HTTPS in Docker containers. It is recommended to try the [ASP.NET Core Docker Sample](README.md) first, which is simpler because the container only exposes HTTP. The more basic will help you validate that you have the sample working correctly before adding the complication of certificates. - -See [Hosting ASP.NET Core Images with Docker over HTTPS](aspnetcore-docker-https.md) for production scenarios. - -The samples are written for `cmd.exe`. PowerShell users will need to special case the environment variables that are used in the instructions. - -This sample requires [Docker 17.06](https://docs.docker.com/release-notes/docker-ce) or later of the [Docker client](https://www.docker.com/products/docker). - -## Getting the sample - -The easiest way to get the sample is by cloning the samples repository with git, using the following instructions: - -```console -git clone https://github.com/dotnet/dotnet-docker/ -``` - -You can also [download the repository as a zip](https://github.com/dotnet/dotnet-docker/archive/master.zip). - -## Certificates - -ASP.NET Core uses [self-signed development certificates](https://en.wikipedia.org/wiki/Self-signed_certificate) for development. Self-signed certificates are easy and free to create. - -The instructions volume mount certificates into containers. You can add certificates into container images with a `COPY` command in a Dockerfile. This approach is not recommended. It makes it harder to use the same image for testing with dev certificates and hosting with production certificates. There is also a significant risk of certificate disclosure if certificates are made part of container images. - -## Application Secrets - -These instructions assume that your project is configured for [application secrets](https://docs.microsoft.com/aspnet/core/security/app-secrets). The primary requirement is a [UserSecretsId](https://github.com/dotnet/dotnet-docker/blob/master/samples/aspnetapp/aspnetapp/aspnetapp.csproj#L5) element in your project file. If you are using the ASP.NET Core sample in this repo, you don't need to do anything. It is already correctly configured. If you are using your own project file, add an `UserSecretsId` element. - -You can add the element manually or use Visual Studio to do it for you. The following image demonstrates the experience in Visual Studio. - -![Manage user secrets in Visual Studio](https://user-images.githubusercontent.com/7681382/39641521-85d4a7b4-4f9c-11e8-9466-d1ff56db33cb.png) - -The format of the `UserSecretsId` content doesn't matter. The sample in this repo used [Random String Generator](https://www.random.org/strings/?num=6&len=20&digits=on&unique=on&format=html&rnd=new) to produce a unique string. - -> Note: `User Secrets` and `Application Secrets` terms are used interchangebly. - -## Building and Running the Sample with HTTPS - -Use the following instructions, for your operating system configuration. The commands assume that you are in the root of the repository. - -> Note: The sample includes a banner to accept a cookie policy. When switching between HTTP and HTTPS, you may see the banner repeatedly. Delete the cookie for the site in `Developer Tools` in this case. - -![Developer Tools -- Delete cookie](https://user-images.githubusercontent.com/2608468/40246148-875fee5a-5a7c-11e8-9728-7da89a491014.png) - -### Windows using Linux containers - -Navigate to sample: - -```console -cd samples\aspnetapp -``` - -Generate cert and configure local machine: - -```console -dotnet dev-certs https -ep %USERPROFILE%\.aspnet\https\aspnetapp.pfx -p crypticpassword -dotnet dev-certs https --trust -``` - -> Note: The certificate name, in this case *aspnetapp*.pfx must match the project assembly name. - -> Note: `crypticpassword` is used as a stand-in for a password of your own choosing. - -Configure application secrets, for the certificate: - -```console -dotnet user-secrets -p aspnetapp\aspnetapp.csproj set "Kestrel:Certificates:Development:Password" "crypticpassword" -``` - -> Note: The password must match the password used for the certificate. - -Build a container image: - -```console -docker build --pull -t aspnetapp . -``` - -Run the container image with ASP.NET Core configured for HTTPS: - -```console -docker run --rm -it -p 8000:80 -p 8001:443 -e ASPNETCORE_URLS="https://+;http://+" -e ASPNETCORE_HTTPS_PORT=8001 -e ASPNETCORE_ENVIRONMENT=Development -v %APPDATA%\microsoft\UserSecrets\:/root/.microsoft/usersecrets -v %USERPROFILE%\.aspnet\https:/root/.aspnet/https/ aspnetapp -``` - -After the application starts, navigate to `http://localhost:8000` in your web browser. - -### macOS - -```console -cd samples\aspnetapp -``` - -Generate cert and configure local machine: - -```console -dotnet dev-certs https -ep ${HOME}/.aspnet/https/aspnetapp.pfx -p crypticpassword -dotnet dev-certs https --trust -``` - -> Note: The certificate name, in this case *aspnetapp*.pfx must match the project assembly name. - -> Note: `crypticpassword` is used as a stand-in for a password of your own choosing. - -Configure application secrets, for the certificate: - -```console -dotnet user-secrets -p aspnetapp/aspnetapp.csproj set "Kestrel:Certificates:Development:Password" "crypticpassword" -``` - -> Note: The password must match the password used for the certificate. - -Build a container image: - -```console -docker build --pull -t aspnetapp . -``` - -Run the container image with ASP.NET Core configured for HTTPS: - -```console -docker run --rm -it -p 8000:80 -p 8001:443 -e ASPNETCORE_URLS="https://+;http://+" -e ASPNETCORE_HTTPS_PORT=8001 -e ASPNETCORE_ENVIRONMENT=Development -v ${HOME}/.microsoft/UserSecrets/:/root/.microsoft/usersecrets -v ${HOME}/.aspnet/https:/root/.aspnet/https/ aspnetapp -``` - -After the application starts, navigate to `http://localhost:8000` in your web browser. - -### Linux - -```console -cd samples\aspnetapp -``` - -Generate cert and configure local machine: - -```console -dotnet dev-certs https -ep ${HOME}/.aspnet/https/aspnetapp.pfx -p crypticpassword -``` - -> Note: `dotnet dev-certs https --trust` is only supported on macOS and Windows. You need to trust certs on Linux in the way that is supported by your distro. It is likely that you need to trust the certificate in your browser. - -> Note: The certificate name, in this case *aspnetapp*.pfx must match the project assembly name. - -> Note: `crypticpassword` is used as a stand-in for a password of your own choosing. - -Build a container image: - -```console -docker build --pull -t aspnetapp . -``` - -Run the container image with ASP.NET Core configured for HTTPS: - -```console -docker run --rm -it -p 8000:80 -p 8001:443 -e ASPNETCORE_URLS="https://+;http://+" -e ASPNETCORE_HTTPS_PORT=8001 -e ASPNETCORE_ENVIRONMENT=Development -e ASPNETCORE_Kestrel__Certificates__Development__Password="crypticpassword" -v ${HOME}/.microsoft/UserSecrets/:/root/.microsoft/usersecrets -v ${HOME}/.aspnet/https:/root/.aspnet/https/ aspnetapp -``` - -After the application starts, navigate to `http://localhost:8000` in your web browser. - -### Windows using Windows containers - -Navigate to sample: - -```console -cd samples\aspnetapp -``` - -Generate cert and configure local machine: - -```console -dotnet dev-certs https -ep %USERPROFILE%\.aspnet\https\aspnetapp.pfx -p crypticpassword -dotnet dev-certs https --trust -``` - -> Note: The certificate name, in this case *aspnetapp*.pfx must match the project assembly name. - -> Note: `crypticpassword` is used as a stand-in for a password of your own choosing. - -Configure application secrets, for the certificate: - -```console -dotnet user-secrets -p aspnetapp\aspnetapp.csproj set "Kestrel:Certificates:Development:Password" "crypticpassword" -``` - -> Note: The password must match the password used for the certificate. - -Build a container image: - -```console -docker build --pull -t aspnetapp . -``` - -Run the container image with ASP.NET Core configured for HTTPS. Select the correct syntax, depending on the Windows Server version. - -#### Windows Server 2016 - -```console -docker run --rm -it -p 8000:80 -p 8001:443 -e ASPNETCORE_URLS="https://+;http://+" -e ASPNETCORE_HTTPS_PORT=8001 -e ASPNETCORE_ENVIRONMENT=Development -v %APPDATA%\microsoft\UserSecrets\:C:\Users\ContainerAdministrator\AppData\Roaming\microsoft\UserSecrets -v %USERPROFILE%\.aspnet\https:C:\Users\ContainerAdministrator\AppData\Roaming\ASP.NET\Https aspnetapp -``` - -#### Windows Server 2016, version 1709 or higher - -```console -docker run --rm -it -p 8000:80 -p 8001:443 -e ASPNETCORE_URLS="https://+;http://+" -e ASPNETCORE_HTTPS_PORT=8001 -e ASPNETCORE_ENVIRONMENT=Development -v %APPDATA%\microsoft\UserSecrets\:C:\Users\ContainerUser\AppData\Roaming\microsoft\UserSecrets -v %USERPROFILE%\.aspnet\https:C:\Users\ContainerUser\AppData\Roaming\ASP.NET\Https aspnetapp -``` - -#### Viewing Site, with Windows Containers - -After the application starts, navigate to `http://localhost:8000` in your web browser. On Windows, you may need to navigate to the container via IP address. See [ASP.NET Core apps in Windows Containers](aspnetcore-docker-windows.md) for instructions on determining the IP address, using the value of `--name` that you used in `docker run`. diff --git a/samples/aspnet-mssql/backend/aspnetcore-docker-https.md b/samples/aspnet-mssql/backend/aspnetcore-docker-https.md deleted file mode 100755 index 451cf26..0000000 --- a/samples/aspnet-mssql/backend/aspnetcore-docker-https.md +++ /dev/null @@ -1,87 +0,0 @@ -# Hosting ASP.NET Core Images with Docker over HTTPS - -ASP.NET Core 2.1 uses [HTTPS by default](https://docs.microsoft.com/aspnet/core/security/enforcing-ssl). [HTTPS](https://en.wikipedia.org/wiki/HTTPS) relies on [certificates](https://en.wikipedia.org/wiki/Public_key_certificate) for trust, identity, and encryption. - -This document explains how to run pre-built container images with HTTPS. - -See [Developing ASP.NET Core Applications with Docker over HTTPS](aspnetcore-docker-https-development.md) for development scenarios. - -This sample requires [Docker 17.06](https://docs.docker.com/release-notes/docker-ce) or later of the [Docker client](https://www.docker.com/products/docker). - -## Certificates - -You need a certificate from a [certificate authority](https://en.wikipedia.org/wiki/Certificate_authority) for [production hosting](https://blogs.msdn.microsoft.com/webdev/2017/11/29/configuring-https-in-asp-net-core-across-different-platforms/) for your domain. You may already have one. [Let's Encrypt](https://letsencrypt.org/) is a certificate authority that offers free certificates. - -This document uses [self-signed development certificates](https://en.wikipedia.org/wiki/Self-signed_certificate) for hosting pre-built images over `localhost`. The instructions are similar to using production certificates. - -For production certs, you do not need to use the `dotnet dev-certs` tool or store the certificates in the location used in the instructions. Any location should work, although storing certs within your site directory is an anti-pattern. - -The instructions volume mount certificates into containers. You can add certificates into container images with a `COPY` command in a Dockerfile. Copying certificates into an image is an anti-pattern. It makes it harder to use the same image for testing with dev certificates and hosting with production certificates. There is also a significant risk of certificate disclosure if certificates are made part of container images. - -## Running pre-built Container Images with HTTPS - -Use the following instructions, for your operating system configuration. - -You need the [.NET Core 2.1 SDK](https://www.microsoft.com/net/download) for some of the instructions. - -### Windows using Linux containers - -Generate cert and configure local machine: - -```console -dotnet dev-certs https -ep %USERPROFILE%\.aspnet\https\aspnetapp.pfx -p crypticpassword -dotnet dev-certs https --trust -``` - -> Note: `crypticpassword` is used as a stand-in for a password of your own choosing. - -Run the container image with ASP.NET Core configured for HTTPS: - -```console -docker pull microsoft/dotnet-samples:aspnetapp -docker run --rm -it -p 8000:80 -p 8001:443 -e ASPNETCORE_URLS="https://+;http://+" -e ASPNETCORE_HTTPS_PORT=8001 -e ASPNETCORE_Kestrel__Certificates__Default__Password="crypticpassword" -e ASPNETCORE_Kestrel__Certificates__Default__Path=/https/aspnetapp.pfx -v %USERPROFILE%\.aspnet\https:/https/ microsoft/dotnet-samples:aspnetapp -``` - -> Note: The password must match the password used for the certificate. - -### macOS or Linux - -Generate cert and configure local machine: - -```console -dotnet dev-certs https -ep ${HOME}/.aspnet/https/aspnetapp.pfx -p crypticpassword -dotnet dev-certs https --trust -``` - -> Note: `dotnet dev-certs https --trust` is only supported on macOS and Windows. You need to trust certs on Linux in the way that is supported by your distro. It is likely that you need to trust the certificate in your browser. - -> Note: `crypticpassword` is used as a stand-in for a password of your own choosing. - -Run the container image with ASP.NET Core configured for HTTPS: - -```console -docker pull microsoft/dotnet-samples:aspnetapp -docker run --rm -it -p 8000:80 -p 8001:443 -e ASPNETCORE_URLS="https://+;http://+" -e ASPNETCORE_HTTPS_PORT=8001 -e ASPNETCORE_Kestrel__Certificates__Default__Password="crypticpassword" -e ASPNETCORE_Kestrel__Certificates__Default__Path=/https/aspnetapp.pfx -v ${HOME}/.aspnet/https:/https/ microsoft/dotnet-samples:aspnetapp -``` - -> Note: The password must match the password used for the certificate. - -### Windows using Windows containers - -Generate cert and configure local machine: - -```console -dotnet dev-certs https -ep %USERPROFILE%\.aspnet\https\aspnetapp.pfx -p crypticpassword -dotnet dev-certs https --trust -``` - -> Note: `crypticpassword` is used as a stand-in for a password of your own choosing. - -Run the container image with ASP.NET Core configured for HTTPS: - -```console -docker pull microsoft/dotnet-samples:aspnetapp -docker run --rm -it -p 8000:80 -p 8001:443 -e ASPNETCORE_URLS="https://+;http://+" -e ASPNETCORE_HTTPS_PORT=8001 -e ASPNETCORE_Kestrel__Certificates__Default__Password="crypticpassword" -e ASPNETCORE_Kestrel__Certificates__Default__Path=\https\aspnetapp.pfx -v %USERPROFILE%\.aspnet\https:C:\https\ microsoft/dotnet-samples:aspnetapp -``` - -> Note: The password must match the password used for the certificate. diff --git a/samples/aspnet-mssql/backend/aspnetcore-docker-windows.md b/samples/aspnet-mssql/backend/aspnetcore-docker-windows.md deleted file mode 100755 index 3668d93..0000000 --- a/samples/aspnet-mssql/backend/aspnetcore-docker-windows.md +++ /dev/null @@ -1,51 +0,0 @@ -# ASP.NET Core apps in Windows Containers - -ASP.NET Core applications are supported with [Windows containers](https://docs.microsoft.com/virtualization/windowscontainers/). The following instructions demonstrate how to run ASP.NET Core with Windows containers. See [ASP.NET Core Docker Sample](README.md) for instructions on how to build container images with ASP.NET Core. - -## Try a pre-built ASP.NET Core Docker Image - -You can quickly run a container with a pre-built [sample ASP.NET Core Docker image](https://hub.docker.com/r/microsoft/dotnet-samples/), based on this [sample](Dockerfile). - -Type the following command to run a sample with [Docker](https://store.docker.com/editions/community/docker-ce-desktop-windows): - -```console -docker run --name aspnetcore_sample --rm -it -p 8000:80 microsoft/dotnet-samples:aspnetapp -``` - -After the application starts, navigate to `http://localhost:8000` in your web browser. In some scenarios, and with earlier versions of Windows, you need to access the container via IP address. See the following section for instructions on how to do that. - -## View ASP.NET Core apps via IP address - -After the ASP.NET Core application starts, navigate to the container IP in your web browser with the the following instructions: - -> Note: These instructions rely on using the `--name aspnetcore_sample` argument with `docker run`. The `--name` argument makes it possible to access the container by name. If you used a different name, then use it instead in the following steps. - -1. Open up a command prompt. -1. Run `docker exec aspnetcore_sample ipconfig`. -1. Copy the container IP address and paste into your browser (for example, `172.29.245.43`). - -See the following example of how to get the IP address of a running Windows container. - -```console -C:\git\dotnet-docker\samples\aspnetapp>docker exec aspnetcore_sample ipconfig - -Windows IP Configuration - - -Ethernet adapter Ethernet: - - Connection-specific DNS Suffix . : contoso.com - Link-local IPv6 Address . . . . . : fe80::1967:6598:124:cfa3%4 - IPv4 Address. . . . . . . . . . . : 172.29.245.43 - Subnet Mask . . . . . . . . . . . : 255.255.240.0 - Default Gateway . . . . . . . . . : 172.29.240.1 -``` - -Note: [`docker exec`](https://docs.docker.com/engine/reference/commandline/exec/) supports identifying containers with name or hash. The container name is used in the preceding instructions. `docker exec` runs a new command (as opposed to the [entrypoint](https://docs.docker.com/engine/reference/builder/#entrypoint)) in a running container. - -`docker inspect` can also be used for this same purpose, as demonstrated in the following example. - -```console -C:\git\dotnet-docker\samples\aspnetapp>docker inspect -f "{{ .NetworkSettings.Networks.nat.IPAddress }}" aspnetcore_sample -172.25.157.148 -``` \ No newline at end of file diff --git a/samples/aspnet-mssql/backend/deploy-container-to-aci.md b/samples/aspnet-mssql/backend/deploy-container-to-aci.md deleted file mode 100755 index 08802ae..0000000 --- a/samples/aspnet-mssql/backend/deploy-container-to-aci.md +++ /dev/null @@ -1,106 +0,0 @@ -# Deploy ASP.NET Core Applications to Azure Container Instances - -You can deploy ASP.NET Core applications to Azure Container Instances (ACI) with Docker. ACI is a great option for application testing and can also be used for production deployment (not covered here). These instructions are based on the [ASP.NET Core Docker Sample](README.md). - -## Build Application - -Build the application per the [ASP.NET Core Docker Sample](README.md) instructions. The following is a summarized version of those instructions. The instructions assume that you are in the root of the repository. - -```console -cd samples -cd aspnetapp -docker build --pull -t aspnetapp -f Dockerfile . -``` - -For Windows containers, you will need to build with a [Dockerfile](Dockerfile.nanoserver-sac2016) that uses a Windows Server 2016 image. Use the following instructions for Windows containers: - -```console -cd samples -cd aspnetapp -docker build --pull -t aspnetapp -f Dockerfile.nanoserver-sac2016 . -``` - -Windows server, version 1709 and later versions are not yet supported in ACI. - -## Create ACR Registry - -Create an ACR registry per the instructions at [Push Docker Images to Azure Container Registry](../dotnetapp/push-image-to-acr.md). The following is a summarized version of those instructions. - -> Note: Change the password location and the user account ("rich" and "richlander") example values in your environment. - -```console -az login -az group create --name richlander-containers --location westus -az acr create --name richlander --resource-group richlander-containers --sku Basic -``` - -## Login to Azure Container Registry - -First, "admin-enable" your session, an ACR credentials access prerequisite for the subsequent command. - -```console -az acr update -n richlander --admin-enabled true -``` - -Now login to ACR via the docker cli, an ACR push prerequisite: - -```console -az acr credential show -n richlander --query passwords[0].value --output tsv | docker login richlander.azurecr.io -u richlander --password-stdin -``` - -## Push Image for Azure Container Registry (ACR) - -Use the following instructions to tag the image for your registry and push the image. If you automate these instructions, build the image with the correct name initially. - -```console -docker tag aspnetapp richlander.azurecr.io/aspnetapp -docker push richlander.azurecr.io/aspnetapp -``` - -## Deploy Image to Azure Container Instance (ACI) - -During deployment, you'll need to enter your password. Type or copy/paste it in. Get your password beforehand from the following command: - -```console -az acr credential show -n richlander --query passwords[0].value --output tsv -``` - -You can deploy Linux images with the following command: - -```console -az container create --name aspnetapp --image richlander.azurecr.io/aspnetapp --resource-group richlander-containers --ip-address public -``` - -You can deploy Windows images with the following command, which includes `--os-type Windows`: - -```console -az container create --name aspnetapp --image richlander.azurecr.io/aspnetapp --resource-group richlander-containers --ip-address public --os-type Windows -``` - -> Note: Azure Container Instances only supports Windows Server 2016 Nano Server and Server Core images, not Windows Server, version 1709 or later. - -## Running the Image - -The last step -- `az container show` -- will need to be repeated until `provisioningState` moves to `Succeeded`. - -```console -az container show --name aspnetapp --resource-group richlander-containers -``` - -Once the `provisioningState` moves to `Succeeded`, collect the IP address from the `ip` field, as you can see in the following image, and then copy/paste the IP address into your browser. You should see the sample running. - -![az container show -- successfully provisioned app](https://user-images.githubusercontent.com/2608468/29669868-b492c4e8-8899-11e7-82cc-d3ae1262a080.png) - -## Cleanup - -When these containers aren't needed, delete the resource group to reclaim all exercise container resources. - -```console -az group delete --name richlander-containers -az group exists --name richlander-containers -``` - -## More Samples - -* [.NET Core Docker Samples](../README.md) -* [.NET Framework Docker Samples](https://github.com/microsoft/dotnet-framework-docker-samples/) diff --git a/samples/aspnet-mssql/docker-compose.yaml b/samples/aspnet-mssql/docker-compose.yaml index e5832cf..da40f1b 100644 --- a/samples/aspnet-mssql/docker-compose.yaml +++ b/samples/aspnet-mssql/docker-compose.yaml @@ -1,7 +1,7 @@ -version: "3.6" +version: "3.7" services: - backend: - build: backend + web: + build: app ports: - 80:80 db: diff --git a/samples/aspnet-mssql/output.jpg b/samples/aspnet-mssql/output.jpg new file mode 100644 index 0000000000000000000000000000000000000000..63813a5e7e135be95ea6cffaca43f8de1105a551 GIT binary patch literal 42372 zcmeFZ1ymhNvnV{c6Wj^z?h@QJxVt+9hXf~(;O_43?!g^`2M-$D36{XW$&q_LyY}vS z@2$7~p3QVkSyxwA_jK)<&C{2suKFtNp7VB^2Q zCYDZiARcxQ54owGJxD*e=5Mg+Gwk&Y+u6E;Z2MK7dx&UeuciX3$w7YvfFvLd$ODQ1 zF<=b10#<-6-~up!YI_jI8Bhk%MgE06-YFJUJ0AS((;AiyH(?ibF)6ZN0fLH;5Pxk*N?~n}u+}9v{ z^uOWAvjE`5djM$c`!}3%5&$%P005lDH%3lIzuJKSox#n`0pOwt0Fbl*0R1xn!0Y_x zHxTWa4&*HWfGWsWa^nDyk_rHn79ica|DxZpAb~&q_V4oi?!TvHKoo!g2Y>#63MA+Q z1q%fQ2?+%c0|O0<2#<(}0FQuxgp7uQgp7)efPjL9f{KoTiHV8$0viVl0|yNQ6XRJ4 z7z9WL5(*9q3JwDa0SV*3T%LLWR9LXL;F=I%r~o)B7z8TVQy-`^U;sG8^Q`-`KtO_l zL&3s8gQ)l*!f)kIDmcgxC}^0cB>)iuB#Huo0t)3Te;Tlo8hoZkw7cd%IY9ul5C9nd zhCoFb)V#RUT6+QvvbHGwenbAV^NUKhF?phjzJ@dtWB$o;Gi5I;to7qa7 zx!y3SN;8*F_xlG$C_CzD6=G_bK{+ukh`{@PI`GVQ|bola> z=k8(>$Qn+wmFKF_baCjHBCW`Vs_4I{{BQK`CwAI$YDAhtmOfKauk|YhEW1u`4}q?% z&s+OdUd67Lhb@ivZ2_}xWnMxplkF*5gRh#B^>+3O7A61y!RtX(2~!9Fc-#47j)oJE zoM)V}UjLUpbL@ES)6{?U1n{5S>17Ev(nc!y5?PEN*YJBhMxmxNX#`&B3l_*$Ava|$ z8uJdP^fV3Nd zq;J<}$hZF(SefCj28@G5>TLv_k2))Dv-^VugLCOh$2|q-2XC&wHW7Muw9k_jyiT_< zpi^3^I0wIB5(>>9)qQYCBb0l`HYwB8r@G&V{DJ7Tj{cqYw`CI;wyrpUP~c_r0r}{R zIYVd$ckll~L@4kRR~r5$B2acTKwZ+IeGbq?*IZEOr(OAuKV->X-rvG_y)=ASkK1*- z9Is;>Ym2oVZ2?trw!?LQjj7+1ffJNof{?e`AL6VUwE^YfpjUyl5g&#Ms1>=vu{rgk;=<-;!DHSvy z|K;ki3v$uO2`KP(UU`-@{x8kz=Z@NzKF?^gd63(*9j2ZDt`l#j$-}RNXP$wlJ_;$z zlbmC1tS8cSjN70}zK(K2=pT9s>r^&ApH`Nj&j?cYUtA#mstgQS%@Y*swPnvyo}>-Z zX4NJ6W4-07OR&n%y?ggX$DM$M1K%?1(P#@LC>%i5KX@JDs*|Xq(-K0$$7cOP=)b*o zVYfeyX8PI(y?&Ja!S5tLbG$p8(w6S6`vhoAcJ15@w!ARlUwheUQP$1plIS498)8yU z*gk!6s?rsEN~FfPX0yWoMuTB@H!ZR-s;Kw7@7Uv7o(VgQ=`GixZzceIpau1l z_usxf0Y>bf!TBd+e8SHC0Fn{V5Zl+!+3xGpHtJbEuPQ%@E`7dD|9I>KTZc&&xY@qT zXuq@_1&wtY>xnF=T4uG~{(XeN*w^>l4O9XT&P0{;@BSFJ|MF7$w>Oz#n=DI4#3<80 z)ctq;@`wB%HE1ya_3lt!eIjAA?4QK8*SF?)t>&D%&WoHw+@sv8Y>_3G6tdZDE zMrJtqzFg#uN7U@@C%kkxZGY_gJg5)04h4Qo8<&jZHR~O2LixG7_dH(P(I@b z0ybr}0XiiD)F&`h)nT3- z-Th~IWKSLxDiU`3I6u%X7A>d6GFO+!EHKqAQfq+<0NxXhSd@hdbIeMDP?A6 z^WBk&g}~0rp^AWgc$D^uR%p~4o04x1;(h=Itw{-&e8#2ecxbg1~&(Yk5Tqo9izkG}G(>j;e zsyqESK&v{}5~XRnSoeB7m9x8hK>Y#!i9H?%1k%?7WKr%Q2m8s06PT?()^+B+TxWN0b{!Q0wFv5{L4L0a{RynKeg9xf36h0M!b}TcCchAPh5}c)W}l=& z#uw1u|9M0{fvV?1u#~E2?4{C@YAq-I@tV?3I|U!>+aBM~S^$bJwSjvDvyA@r*BK|> zFI=SMnKrg=&DTS~&g|UbBwi++-jEGNMt8=5>g_j|$Pcd$F7{x6Q@>wo0f2`KWo1Od zUa~Akt<-%yxJb04w^0ZnC`(->a~iW_j5DW&AN_G~^_fJp;1z4BIf1=lUF9Or$RgC&dv5NzfPr?lzkokaJQ^HtozZs>#LMla(;A6aq6yas z{eGuDhw|SPWW8~L^qq11)U+*z3YAV9XQZhNA3ada{Z_bPo>SYu6i7_=Ltd}v9Qu#) z7u$bBfiny>G06Wx2GxJ@%3rX5fX^NH^vA_N)DXm=n6@;<{|CY!2(V$^Pn($1$eG;Q z)kAFdHtl~9{;mcud7cmdsu0wHQZQB&01Ofg3jnBk}=AeYQ4RMduCe4&f}dV`CElSdJO+ok`1 z;&5W!HX9m^Ng`vE&<$_F{m-bB;se)bKp{R{#UL^Sgk+i_jj6!V!`ca4K1BY7N(T?eZpq>CcD~DznhrN{?#iWoHwB?V)Yl>2g11l! z>;D;97Oazejt z*#Y;Hr}aB=0a|1PE=lziVzd%+P)uoW_bny1`zrRWLj#P^vFh7$*B+8pZLFlDdOquc zPfvhFV<>cNGoKzTF-qlh|K|<0UzUo6@KS(M&#zb-J_b7}tajrqiHvQUZ3KE#svVyr zJ2W?jI!fy;`hR?k(~S-qB=LFM=kmy5hP&3th*}d}6<5P3od1^lcH6S%PAex<9MpIy z;{`U=u;j$_QjN6~38xWl<4!VFwJVD6n^l&plk8rO&L#~HFS{4JHp;@fY00I&1AOo> zK1|Kr&Zf;bSM3t$;-=Q3EgMvxQsp+^D=9pv)AKQEMupIV z2tSUISy-)t%o#WKX>kY`l0?vg9nosdUC@ha1HwAp(iT_W`!i%(4!qqA-9X`pI{t0+ zrQ&i86du9M+;<+e;wV>^Q&=6k!;>Yi$TQH$rKkQ`2!OC+AmZPK4T9s!aGcLrT&`HU z-s0bhxj060M!jVGo!)4^j_ds8bN?DhJyX#W0Mxc!JOT8>arOn#v=KkrDCHkmUx%O# znvY^@i_*aULok`H*OBi%$0nMK?EVw*iN5kj*C?y$a+>q+k|65e2jIUabN^=XFc{D2 zU?xdDy|sR4R)^mOX60XunOxdBq5^|kAwiKoOXO!rJ9?J*iYSP;Q~fOUax>BzPk@dp zvX#*;*M15*yJOveJUJ6i3$_K6QY=~_X+be5_*8^wAvhJvje}Auo#T7iI*3%MPsZ?u zLMW2N(#k9q4)!6s|8{ zyAry6*XiEz=(r=TU?YwFsG89AaCibb@tYa(lQTX9GCgdx68xkLQ&iFp2%W`H&(6(X zg4Yvt{Ivx9lOPxh7N~ELBQhjxdo_#?`^fXJ_=YoA=9Q!*B1PgZ;C`Em8EE&uX9#p% zOc!G*oV&lm;_nPUw$qb6WO5sMmg#W zi(h&@odSYV`CKsUfEH~(eM3zH&F~Gw*15_uV79w)uTdz2tc??nUK zq@ct5dR_8S0KwFRdYJ}2&79aVb^DEAnMlzPyP5(+w|oNa#sMn^>mv8?MGR}GdMf{g zDcR9aF@k|FttT_v!m=?qJ+J&}Iz>1cZ$35(c`URLR@JOQ*0}eK&XVnTMU!=cOS*B7 z*P_N=& z=nrmx->;gMSQGEGpi3Jz;MyF$fCUl2MaL3)IM9~d(fE@3>$h_93sr+c{Vu1J}3BvlgkmGg0sj>lH*anqXiV;Sb3f56R8$ zN{sEg?mOO1Mxh?dxVpjA_Y57wA5Pp@kbLDsq$APZ&Pueree)(DT7z^z!u|^E^VTOB z83?)ru${N0ipYGx2O^xLT8|!KTbI`}N}-N;#0>O=l1F4pe%(ZvvlzSd3+dLiY@?yE~ zFWX}>VoC@aDWXa&@heOs-f@y+Wp33GX8MoXx!TtruI%C-w><#@)1HNu7N#hpcIh&s z>ZElP9uuFFw3oS*XFsluMmd@!veuA3Yi%bZ84` zRfaPih<-Y01Gbl>)@g=b-Z4d4;tKxomi3o(&5yb0IbM6!XJft!~f}D204`II(Rh@w!A9K&lr__FTy*@cG;-R(0Z#X6= zBra~msNez8o?1>#$jOCRL@mn$`$1`^X1*_ZV?+(ALnKA8lvRRFyj&m$MM&jeV_=Yg z@#c_AijX?ypi8h177>`BJiPOuT?oxk`_dCoEoqbylCn6{_F@;LVH?UQi(tQIV030Z zmG?F9<(q!ye$D6%oTx?~(--T3&zXGVP{`7+z;^>*Dn=Cwauvq4ZAGlfIbgx_#ra5R zT$9gaIGzf>(%aH4Z|`1hTSSnggBqG?m~}7}4VqvpmU0CtVz`2+|j{FIA9 z>|K`VzelXP*VkCw@zmEy_@6#~^U?6-ZgFPab-1!Qb8YGu%B$z@-M#9BF-K1%8(bET z$au*+M5{&>Ja`ZJ1PtD*?SN8J0aQ>13Jwkp0|m-Tf2E|)&k#}3FpVJ5Nm$sFQ80)} zg_RsZS*f8v8EZ^U_tcrln;a-|_6Ph64w5 z21KXyskRZGmU=$Ai6o4&sA&`*$7B1Ouse^ZVB?#)jL@gkIu3Yl zeDg*X;kyzs_HwbGYDjcbB5p2q&K-hEUlRFs8tqj?j2b&hcsZ*PBF_z$3n^h%4Zw~> z1;)DAm)%y6T$Kjera%&fUZu>BLC96w7LFb*!po&(d8oA8M|Wm8ZUr}85ruK&=d z`xUooqLk?N;-{cM1Z^RAI+v1VIhx#jn^Tlb!b~t>-}J{jJRIM97S^p?tu5=D z2FU`Gt-apjwyb3pAF-rV15CCo#JU>WfRKZ7RLJX7Tf>hB=Pn zp=Ij?S49Q~`T3e2%Vd^>9ahi2lNE_?d^g{0n|*+m*<0F;!Wc|mAy|i+pIEBKa4A7p zdIA{MqzATCsYpk_R>iklp8$-XjFLl(ug|gy^pP}ITPTOL2bn#t#Pd5T7u!8CeiFAP z`q6B+Zatn^R%Ku{EY%SOU%!mri!X|a#RL^i-+jdp1jd!lKi8u z#JZ|EIk!jKTQu*K@CVeH+_MKZN4*2@{X+lsNz}8LKM+2mguF~I>bNl1inak>$vg!5rF#W`~~w^Tm=Ia`KI{&4b-;D3e` z@-2KV?nck(m541Mi;zVTG#M+n9~Z@B`zLd=IN`ZKK#?&Xy4}ln==GY*Ys(uyRtiJH zN!M8gA@@j~)4y_QSZq90=HagRK6D5pI$<}R{ZI<3h-H)i=6J1aSyA8OxA53wA3}&A zm^NDjzPHpZ^SC!ixHQx+F;#atj>Xd8T(a>~pc9sp%0Nj-s!(TU(?&SY%hTp7ddA~g zJ!SYPQ%;2L@254 zajPJuWIOSUxn(RK~YryHU!B_!KC)u{PD&0;#Ye|E%= zd6#Z2GcV9k+OcNY(Kj1UuzNz?GO?y6gT`l1TfnMO=cs2alce#sW41tTAii{-&!cQr zr>wz-sI@dd`v$3BwZddyCWkCg)@!aGrWr4w($z*)SFb&%Xz%J_w90bjuYW`P_kvuF ze}>0bdb<;(OKtVQVkCxF-x<^o6(Z16f#RF1BIbkgAUEHnS^(^Pev_Z09?Zq9d9&n~-NFPP8VC~7<)l~Hwg^x-xQo5w46)+2u z9IGzAOT;AlzmO!itEt12h%;dpT$f@rcB%P}Z$Z%_^??3TPdd}4q;6cI8{dv-y$BD= zLwGr1r`@&KJ_cRVz*ZI&qg4Qh*1ch=OLpw?(B^$uvCNowwvm1kc{cN*M3syUS<=(f$m7a+7Nc5t2& zy>ragIMz5S(J1Sghtv~)+hPN@61IOtV23IEXnpN8PuGa)jpFL|jtdW}TzKx5hFuN5 zVyzUsOijBKQv?G{l{QGROn(Z5&9S9gp%!>yDeR9GP!9j80{#d;H7Svu{m( zI&r*_E{r7l9Id@1)kL8!JC2N;2f}cVG5K4lBXbHy5OvkZO`O_~l5ZLy#`W!g6|F-00 zPkbjIVpVNY>XPi2DKWTLqO9VxidLjDwDHhif0O#@8+V%vYxLp>WyQl2uwhUJ({#xQQ7H3br%{Hn;vsi|d3N$F zm#6Xr|12Ra@6GRBir$4mQ83;85GwO&vEPt0cJ(tFngkAqLMsxWoCa25WO$MWoi(du z$cVh$eWrb>9>j@)mr~}o&qg6sS$``$P%>25=+6XW%}s>J7g!sDD27HeUMgKtXoJAu zJr%4g>^P+;oF;?P_mO`ddt-`S+gCc)#OkXv90zzYRdHcs%0oGQ)Saejw62S$ZtZDr zu<$mkylKR1HtL2apas?t^{9BaY%FS__eD+@yV%Zt%wJ>Siv3q0Y*3+2Uw3_UID`@j z`N+2Mi@BZAOuq>Wi_AY2K>UFCi|rmy&;U^&_$LxkRWOmLPw+3k&TJo66piYHBZ_x$ z`aK%eof5y8egv+{F0-`?qL{mhuuaI|ubfoG8Mgy)i@MF$7*bJ&R*#l71lmu4>Ck{7 zcOK!Y!8ke*@#Yo}@wbsAg3rzw#QYDr`b*B~4f39jxS)=>3;8g1G%1lK3J9CDk+7ti zy7PR(_$G)J?Hj9sOisHRJj1WnTM8!fE@Q5K{#Bs4o7~55uLOOsqWZYe!Y%5Da?W2c z7D`FH(}r0z=~Pk7(wyAc`W2BwSb?PlZN&2tFhRs6P{fLsxKN@lvC+cWrXOKc0X!O7 z{3d@By<$zdXf)Lb(|jrpSvS=XY30>+8kpMHoYrA1aPxdj;_ZACz%r_5ATxBH>sY;} z%eo=rL9N_jslvqWg5{UTKkHgS787BHN|9)^LVFU4{N}v(U+gTTgurqEB!2imog37J zu^S?-*JkE%oUqlX5xJ<}X7=_t;j&R;L!-vYqCwmLY4DdhAj^Ik39{Ga zIANwygK<&!mFbPT#m~1k)~uT5QgsGqBE8h2DY5j#@xV7p``Z`F}U4_<6t~Bz%^c-=4^P^g7+Gj@lu#80-LQD#k zRb@3QGilYVG^^M?YOz@7gJEL~eZ5#zSha+YieAxgD%3%46cfEpJ6F$zQ z!18oVy?gh9zfg)Nul9w#7VW@DO>IRRWi#Z$GD17*d@4eo9E{6x9Yip=3!UZcZ()WhhCGpxE9C zVIz9h>QF=qqj;R^k32c>KBD+avCQ8!E$e8?(N~p{MF^(sNPTp~MtW$*il#srcU%JF zl=L7w#2lk)i}JQLh4e@gtqiI5IlHQpY72Cmm^HXQ+oiQYL~eN=>JWdg_{W`(YG&BY zr9*7O+q7f5W#j04lPFoH`i}=qv>|BM=G>e%=!?ckiKI+fW+6v4{E4Lf-^FLpE`(!I zfupcF6Vtu8XDl&@Cpx6HipKYqH{{%q#zv6}eG;jaA#O?aK^GFdc?){+SXJ*mST>1En6(}JYFw;4zgu0T#tS`m|Gaq(oYP;dNra4HqcH$76kwY zARwUOpk9DpGkD$$fPt=2(MVVz(b zH_i-=b9<)AMFY+;Ro-m={`LX1Ah=MO8h3Kfo+5_Uf(tF2t7w==u|AdjD`OqgMXpYq z2H3p-$S~O%%`VC(fEuy@i3#<+5st+F)CnIJ!A02YH3xHn;kcDqGW;Tf=e5}22t|2) z1&S8&Bl9&5er2Si0}_`ccT;d$Ub;@N{L}=)M&aH!tg{&x=P(beR-XQL_Emz-H9Y(O zpYea(J*!|zJCxqxbCJ{-6|G-+KOh!S8ZwB?YOe?j3_SsDRS~j@0ZrZc!->LlGODR~ z>U)Zf`=$scTAfco4|A4N;0LBKeR}p9ZC#HqVa<$Al;(3K3ow)CCD-1JUB`Z5Y&@X25CwL_Cqf{LSr0tnFoG2gt(_!#3Psae?LPv;hrz{n60J>H{iQMX5?Ov z#1_R&zN#0}!H)64C#H=RkGA$nype2_d^p>J4{9#+3pc@Ga0pkQEPJu1;PTGYx82HV z64iGLPq(hm;C4WXLfr&cqUzB%|9@E01$y#MEd;y?vza z$=NEN^v{h}_PB>$7b~ip;Js;uQ>3ZbH2A#!c5MRgWfro|_tX2XoX+cxbTobef~Mp3Yp+uGykjB> z@56W8Xi`_mr#r$N$cPBPB zo9E<5I}QwazCY9o!z@_ADEPtF@#6bSAz(>e@l#*wdb+G$bmB^|mD?Wl1a8A!?dS`C z&xY-0ZM#+IMLO46yhkYSvt!%P-OonL(6&kRf$=zs<&>V8%hcAyJ(RU9^+}7o^N928 zCAr9%S??d_zrT^Xx^-G_@|`<_#g}L|KSE6;88IDWJ5^Kf%!9Q;FMykdD-r$3uM|BV z+n+zdp`-aRja4f3PW-D*HUci!66^>o6`$=Ed#o#$WF`MF^d_nxcY0auVv6PYWx~SL z%RM)$gRet4mY3|;has>(VjY4K2Wm5paM@d95_T);;uqETLR7r3Pd)1vQ`Y)r4bawf zzP%hLET1ka3UJSP>>V1mxg_Eod~kdM;sqDbOJCs~PbH!bp?%cveiNQx#_2FVo6wv# zCZHnhz*_ZTf=it>A$iv#m0Y_shEX+az-ZfBciYT2VTd^n#Rh*ocY}k_}Z1Yq?H%vsg*HQtCD_ff7_C z`8=x=Dp;&F63cNQ8#LwI6dkn<&#;FcGO~PJz&ba@Ij3SlN_|zC-)OFUyh9DMs)%M1 zqj;R9d1AD#Ol)1$&(H0aR@hn$4wW^jG>k5-^JCrG;$^g{<=NR^GxmI|FQ|wyC*a+D znS#wQOBX|u)Rz)M+?9J4gEqli+LvkONsUM1%$F7^QVTIHWF|11SsRc@b&6prE-AQN&?7bFf5oRe?9lbyhX#zNHycGIBg>peJ! zE;*Sx=e~as94jtv_u^O(?xy1CYs~)HPM7@?P`0B2Gq3GKwm12&=WsS$K`;8wUuW%w z^AOt%{x?L@E_nfw3$|$s6X6dIs<_I#Fe=_0RSt1~)55S>p_A5K(SFN5qw+TcxDFJp z5Oc0r*E_*~xlZ_s{aqS56uo1PQ0YoLHwPcQ4kO>H;K- zep`~F=0Tt#s-#Q%0=z>=zgZLJE&{M6 z!VCJYA2!<@Ne3X5mo-S*LRWtv4`a}U$|j>MuVY*`U^rbsRM+iy)F$Zy&+UrZc)|EX zYEEAZHI8(2ysn7+YRMAalsegu)w7}91&@<5`lyeFliC@)>lG%q5&Ed?c>bUcMW-QW zlPDNN1x(KPkX9DQTN9{?HjeQMtJgy%(De;U`zm?M=zOyy1*H@Y)|g$$&2M4qnYOHZ zOBqt!A_A)(=Bad7bj0wk-saJQ>nI^;B_i`#i}f1K`e~|Oy_~e=@bjo6Wa6lx>7>to zN5>MKx`5=Uh$LZu;aK1BzS!vPe1>7>#}@#H~8S55o47&OsDPj;cq7CP^$-B)dnpRM=##m0{UUO>zf4wh4>L> zTMyn_PlJD_X$C^?_{bMXdnypVjLJvj1y8e^?5#n~lxX%i6+4a-h&%%**~6*u4P(4la@%u|~-Z zSY^+*Co{N9b$!=MD?PiZp3-9pLrvtIa5{zqaY+cQH}qR`XK@r|YCF@P_kzb8%IFop zhkMx0Y7b-~V%embs*;kp70E-Lr^hhM$^W4Y9k1-r1zQs0Mis>~L=TJfMFC+HNkc}P5c3unv^mgXRQ-@%OTMc%k0!%>n}*{k_geq>afzYjvC_043bME7;hP+R>4|i+y6UWVtWF8> zDpYaii`j@1y@X<`xDu}`;$x#fPD+YA5OPRw9 zRd6?UI-{sbLRYVY$%b!a*F0Y&na!5z4?yV2r>}wD3`kux`(YPqOVO?KyALT}|gLce5> zFg6mbTEt^l`U0zQQ2a*kx)Xa;K&Nz4s1?WclP@uLhW=}x2G1j> zn^>WAMDoZ*qF8mee2|L&<0jluh?Zcd7RF9X=?BCOHn9Y%!p@op6AYVGHpHx z3dR%k*5!xpowe_tvQK~lWy>6u?nEFiZ5>n^*D73DyykYzcq2X*<)~avg6|!{xQ6ns zKbh^j9FoHJ*#vgT3A|`{ngVaf_?^@73-eNi*rLdOCZxtB8+_75ELqtKunNWyIHgRl z2rR{g^ji9v1*sePx+?1J!V%_VO!SXPngk9kC!Ow0URi7N@TJV)25Hb8?h80p;cM4k zd26{QFH$TG+7@t)^KVkf$k8m)H%frS#)d0#V>e~Z6lZgS&wIjemSygLw7kqh&=hKn z$P*6P_d6w(m9Fh&Hw)Ef&`~1ER4p9dk+u>MmaU@ookztIt1fO-h1!n%n3OqeIySzN z7>&=8krq3g!kTDT3vPvZQ(yW8?M{&0ki_Z3Z~@5P zKCRdPDFBqJ(=otDF6$8R~H?~KI&B#mA>tU%^tM7QXYsEh7$W~Ju4=7NO7ubkt zd(w9cneU*m1ShajC0;C6B+ybT$RVbiUR*-Jxj|*7lkA3AQ#OO8BaAbLIO}WI54%=x z>sMcrn@;DqU8JCZ`(R3_#EoWRBW}(|ljrA46RU8Ri5Hn7rsT`=a077S;xSV$veHfz zxw4!wA{Po$%Wy0OWpXl$PE6WcQpr)II{7miP@a-ihJkU2nTo>`tmOz)bI_KFxmH-R z(-*t~NQIC}EPhb?o)9m_ddtUBRmvI~p`eaumI2w}9a&%rOc7yU=IDc&BJQa%G|Oos z==qk?6R@PHy$r5eubPgfC0EFu#w6s;TJ7F36Qr9 z*R<~S;`^L#X#2%k_G?0tDtq-DpDk~WwrLn~SxpzbQJJoSYdqhgktb3ny5W7Xa58qT?~gql0k2*lWj|pTs)1 z$vgM6T-aEE2%Y8Vs%^`ipn9=8L_3FZx73yNu|;=XMy1IyRR0~xqKz0Pm)J;&ny|8h z)hf7uxs81|S6>gt6xN(k$)!BgMWRbA6&**k`cH2~oRSLLMMA+|_;E!X?H;@we_ioc z?&2>S3aow{`6X%+Fzt7_cMo0tNRj4I{a`~2KdX-Txx{t8+%3u|I4uQh-*j2wn;fh8 z{3uEvSV)C&N<3aE_T6XF31dBKs6(tw8R?OQq}HIS}JT*a+2uVoEmnH32yo;50IlByPg_4VVJ~NC^nK zmV7x%Iwycl_%TIfEe+Z+t0K5YZdUK@r_GV#HZb>#Timf_9V}t?PQ*#hd?X$3YP_XI z-b1JgZD4V8-AgM^qn4VIh9Bs6E>Vzqk*?FaCDlAb=pz=TFs#IJ>B51C#FWoKs|bw& zefR`?ck3=6NPgXP0VRcbEA0ekrn-Gz`evV*dfZg~V71Ci8~M}x=e-IWtWvEK-^)3O z$QwmOMhJ~9pu!%bEAN&#Rx@t##{xlNPhjbNPxKhIP1#*39OG7Pl5lMwN15wkh|^+7 zHO(?sAhSR@FKKp$K@isqatkC3ye%nxHdcROZ6he8o?(Dtw(2q0uq1y3v=h~l3y$Y> z{m5s|r^6pWe}H!jgJTeMt}IUKKb!f5v?+?gOfkjUMuM}8o4_0%sf=d}!Q#}V?n z*N@AjLg+8e4m7_Zt)xCmoHX08*;ZWT#Z0y0zMnU5&>b=HmM7v=tKe`f{377~ zBXWHSm~a%Q8RS=_-igcOmXth&$5}FD;ui!Gr4S=5HEO}jmzeOO$?#4?%X>aqH#%VU z-uUU;AaXaJ^_)&H4Q>?B4>zvL%LdhH7P^IbQxCM>L_}}P8c*7 zt49TjHLb+Ctx@PXMiyDTplxwAn|^HNru7G50{zI>U1gYWN;AlfJ{Z`_81hIVAaLYF z(yp57Mck~SO98c?b=!>PF;!y*OTStRdQ4F_TQhsDPuv&5YSSh(NU-x8bR}tt%xL7+ z$gN@*PU<=anTH8-75kiXPJiL#Zj^w|cw-yzmI2(?LxQfqvlP2r6iW_c1=~PUSH0&( z!QdDOTbpr8Qo9P(yt@zPib&l^W^kC#2XmLS+O#7?W8V%p0ZwJ(nO@LHbS`s3{;Lh7}w{2>IIXD+W9=EB4XoF!JF*}WpynF zWyYT|wLA#xvlp?$HVsY7CvAsI{Vbm?EHaFvH zND+%9bAP&uWQ3%OF1q-DdceZISi48(gOl<3Yel2>S~GqbItnrf1lQs zW)k07EaRxSp;^(Zw#lMj++Yb+L0W1}r$9TSPlp|i%+6w2oAvD&Ymo8!#}nZ3Nt~Jn zB9!qU%#R4xBj8d6$BR8mVf&C&8#2C`^ef38EImuPM*PBDS!K1IzWh}cXhDsP@Ky~g zZMV@NbPa#yaI``?q|@e`fkM$B6WLtca$fN!3_I0d`L*DPcp^oFoqCO#I81yo4XLt` zsCkUmJGC}J%LQLqw^J5d6H)idLNMs;!>{c#JF)zNaij1;d8!N5-T5mv-b@Q!XQ6P} z2;<=QdftvYHjCz49}HBPCsGq=bqs8+mdD|99Pd$TM=?qFOCgXz@j0wIETtIBn`P^u{`ho z(TALQs}Fko(K&Y5WiBqO2Y&5_xk&-MT^`~b*?pdU5WHx zx!BNvZ&vH6#C%g0q_X$#iduVTCkV?y#EduOJ3}^M?c2#DeOlaBg+P{(ixz&b5xjx2hGL8igX+mZnIAXlO8qIBq^hR3 zVfOivX`};_Z><=H$>O5KBwETK#lXoC`QixM8O6k6M_JxglBE)4?2_RqHkIW!-e$6CipU@xz6hrQuM~U!)UG z_hqq?@IerPnxQtzEZH5oW{q)w7#971rV0{4BIfA6RpEvw-h;`9`1($b* z^AUr9_nnC}gm2Wq$pu7@htnC+1fbQae$n)wzCHtkrB;dBB1YgESyR7VT@&(9Kvr$m z4oZfYPQ416&kQ1K?P0OR#YLGKViVaW!HS(V!tS+Mv5`a~)1sbN0-$(O{W(D>j>}pV^G;$uuMZq)daB4$aY_p>wbpbv#xC_XV-FkQ zP4HW4xZIej43fRW8`H(Dgn><#j}_oN4ZMe#FS3QgjLAY1SaGG^$2FbAD@D8}K{I&* zEF=2yqUw5=+dn!4k0R_J<$kTkmO~ys$mQ(_<_}1Kkn!?g%6};)LXN?&UvHZtNzeQQ zs46;Q2~oTov<|4iA{D!ihj0Fd*Y{Xzmz;*>z(VJW`VJl&I62%ggnl<~Q3p|NVNE&k z(p;!>)_jdlXb4xLA8hK~m4j61$g081qKtUtMw9&ICAt*UgU5cUy(PG8S01MMfQi?P z$epA%Fdqn0E6pvcwt+gYiXDfD)oqyfXGwRKbw=|E$(WLjqx8i zX5N=`Dgx^2qHNY+n(yh2(q@2O=CMPzR60Yrq*kf3Os9mqmIjhI(~vbAHTLVHzVF#g zFtRlm0V_45PTvdD-@Io&`+iCa`TqLmEm;SG*n(BvB1{8+m9T}ja^uUksv8k=#JRBR zyrrBT8&9TzC47S29G18Du{5$J7W% zsj8MerbgAJtH;Bl;M`aEibxe{4TP7kX3%Xtkv~<_b6QMC-Z107s<0f0vWzvTkf7<8+<$-FSftT6Zs`N zB(ztYx3&A_E5e^keqaLok%rg%3Hvorv->BhNF1)1>b`_@^d0I3NFn7w^_fV0!)nt; z14eB4cH>3ZAJaueHKHT9Py*Zm`USE+#2qKc2mgnSH2!zza^BlJI(M>v@PVe)Z{)8O zX*&*dUiPQNd{n=;eTFuE(Uj21bZ8|VQ?SZ%P=^_ zb#QlgDK5pGBBi(%hXTdjp*RJKySr10L!lHa(BeJQKCe8l{onVW>zs3a*Urpjl9f!d z_F8L_y^=eB5^-1qFh~I-5c@AzS1)fn{EV~8PyGWbZvC6_=Q^MBZk22%qE}fu}xx6}e~Lp?HaHSkFO&U6zT}cBX`Xe^Eni{VBD!Nj%e zUp|yRgd$E|g9-mC&1X5}?a22p^pL7i&1?HX4hEM+6=x$=sd~25Zv!?1|4|XHcQ8_I z04&Yws!@Y%(ljg?6Zas*e-zBk-`{DB#CjN`fRU8nrUQ0r@~2Hc*Az|%Y~{fQjA8+) zos}liH3dsE_6JRu2DdDJgq_jgC*gW0{`L{K z8zE-nY9xuv7_SQ)ZkQ=KxsinNzGaw8g|XMVV;958>U+!Jtni-io`g})M>Jg}D=pQnk- z*O~&Hi(yMC*MY2o!yW^;%DwU!(F`g3-esOy;nRUJ>1}-9N)eOx;)q4AkoW@c8klPQ?c2W_OSRqA%pSdyQXfUS$oca{72Gpj= zt|>Dyd~iUcBx3c@m!WL1W}SCQ#Pcu98G*{%NxF-O z=e-~v-!95$xrXY5V z)CI1Ja&GS4x>c~I^!oHDt)d&-edS<*|5PGV!sD;Wl15xxqBgTX+&f>QJ=Qlj% z__M^--@o;CeT|W$T`UfgEgFyAzmO={v82XK?=ryBL*N&G@!HRBC>Nd1Y}UM)M4jdn z|9$l{nyfVyCWh`nUYn>e<3t%G1TC`X>@6;QCaLcnlH2;^%U}b*Ly*cotBY3gm{z(q zQix@*xdJ`AqEi5g6g7H3k=hSZ{tyo|xKlHKh9&Yq;+M7AU|_vKfv(aK=wEo(4dP(r0wz$f;mElRcOvo=c`WPQaVJv5X{ZuzAC= zo~$2&r&Ri*4E~uOSm}YbBs;@RzNK-)r&5b^5zP$Bo))RgXKYdlH^C3yE+JgS!%^^{j~)Nl2N#YH_q5Y{kgRc!$V$W z)c2R9eUIA2S0sADllzVbqbLZyxm8|kGng2H9gap1?m_B7t`qA6a}FGz+%`gb2=Qzl zo`iAtEcZfGMs-5Mk^J>8OYk7PrZ{V+m!)KQwa>={XDeS@Eaw3@_3Fp3D)q!ru&LF% z9TRTtm8DXxk+D1;Q)p7$s(7GPBDJ`D59-Br*YxztEoz{a?@Acz#_R^VMlSPlWC9Vc zS2n1$K*pjU4X4Wa-GTa%hiYQz(%=_YKT2d?^7PU+Yg7+>inlgUVH-yvVt(?dYZt3? z^=>gI+q51vJ}$)xvv$mqqx4Eb1M3BI{IU-1d=kCRK>d|1eSz@~38jLhK%2%*`wu_6 zl_r!S3~397$V|3e-Gy?s1O!@GUl$^q)8a1f&|kG>LDB z9Qicu@#qr*gAsL@6s9rJ7{}M6Yxf{_T3nz?(UcuD@M*%z;53;+stIo0oESC^IhSe# zGwtj9w9NN)mUd5l@;xp=C$^(`&g&AK9BtwpNfLxW@7^jXL%Lj$lkODvCtA$Z`sG3k zjCNcOU*<6ljkl&vgwNa!lv0^#8xO1KO6wI!vj)oZEfmh#?(<9(#ZCr3ynU)jMYnq} z)Wr==-nkWOs`L{3pnBS*zb(!}+FxA9p@CzQX6E+sao*q~ro1y=bt8QaJvpUr`3hCA zCQYIve<9WD6!FnnB>c3D+=q)|v1qsHT?{}60B#sdXgdw5m9yEZQZ5g}6e5#_Mk?2@ zJfx8^uM&!i_4ZVO>@|3Vy)G^}gy#qW*-~TIL#bodB18Sa_mZRzM-h%(3A7E2dDG5& zSIF5I+S|7xkrYT$dw8sXw!`p}pV4Q21DHjd9ErLHJy1pI@VY8ZhrvO4R zB)OkCo-FI}o?sZalhAY+oTsp^ZLJ@Q;WcQ6H$HGIzAQ(@Aqho~{~BwP!e4cknwFMm zv7Tp%o?yUj!IyQYfABV;nC30(oE8634|*ZZHWqXVf8um!@uPvFQ zN4Fo|2x!$Z4&+)nZo2q|(N<18c?UnaMk&UWA4`z4YiQCM)Hl z%D#HUCVJ4%>!EWdF8EZNwA?>#H7PPdz_o0jzK$mrixW2KbaeH-k`t`4lT+ClwU&Yz zb}ZOKey+*CNF%DLIM)xros3zBUKV{5Qm?IZm-ejO)0*LCe|a>w9#e>1X2Bn~wuJ2R zRB5c^x`}~oBYmp+q}*#mf9n`dsG|fU{GY-ZKoFWaJB|K}z#PmfYld5!a#E z#>agL_;zKS!xjW`!@U3ni%{N?;ztoRqHS%L(7qoUtAnqElC5jiHQy$7tLu`N{H^XXwr%C z88MEy{Y=Ag2uC=~ZO79zdK|`2Z6=#|@={Tv@75!W1KWyf6UkKg7+=vd*LGcYEx>W* z;bfXPJ}@4pDjdw$8U-3RnqY((DokUnO_koakD^Q&hX=V9OJ+9$Eh-ibXARmSgOArq zKWL$tyQ{x>JCdi~;}TI}A&p8W`GziatQx|r>;;bDET`7AFQVs_Oz7VsMp64(z~2|0vm~}ZTlu2( z8k|NUIyYaeXKZhn`#r}l7VQnrPe2OFv))FDCt;&h>$lGnF_M(WZ=&%xNAA>^Kt0T? zO1^7X@6=EtJD&?1Co2%=bMjg_E$R3O@~I+vuxGpXj8-wh7b-gWeiv_Udfdq zj*>hQ5#|ELFcQ_}V>n;Vq))-wv32mJYoyYQ3TiOi#)7}wD3uu>a4pVAC1eT2o_1&m zJ+rlWeXCV_8TvlT1YDaq8sPB`6bnbW9TxC0KRNb$lO?0xm#H87h>p+j_U)w8gNf{o zvOCu1sHxjS-4vL_mJ%y|0&2e(GNU4qCWo4Za~IMegtoPut3`jN95ySXA%HN;S7^#p zC)I1GZweFVoxBuci@-iohv0eo18wq3yz^^=u4b!ocC_xLX{G8ojZdqb z!VyzMogzGvPD_ug<9YTIfTklgOw^-f+#gM2R42a4$JK3(;s>dFiI&f*eQdNYW?J)izuxJ86 z$P8~7O$ldGx$wOz4?#$4kM|Y1;@sNHseB;rFt;#q7>A8dCb*}m;t>mtN_^E1@-0H{ zvd@14#6~l_UH!v(%8p*cxm#`ax>C!APQ$RMn(8m}<-^S!#Q9w2I;iy#y1QfSUn`>& zat9UkWWR%6m7^Mka?V9*N9J*O!WP0xasbO>C*HLV$bdiS>9I5k&xaq-4!bm#oY>&2 zTL^{4jS3|?>|PSR?wqg13k<T81yv1ER*1T%6Z!$ztG>0*&kS1^b>fCfX41G89X7bAM-4?2pII8oj z)#NnNQ1QGa=a-~g&ks~!s3NNxY`g9}g=zzzV~Oidz-%-}#W8BAU!>_Izw+_LHB7oP zK8Nbn8@+`+TNdltcuXz)TxbG&T>ks`f!|NnK|sL%tUOK9--0+z66zmc=`I2Re^37# z!5`xolFpR~YfQ?_YFh~BcYeFgDltfjIMlJD2Nq5%L`P^E-LpCSmSC*=q zzm%@%kC@UTTn4$j(kCab-{Fl#ZzQv4x^Bw}17LvpcY~U-rBZ{d21yZ)IEG|7KwB zpOgPn+z)d9@i#B0{u9NY(>qiA9e?u{2LJtEUmJ2=y#LDWe=axh{#VNB!w%!&->S)OC&dn}DYqN8lkCZ zU&ZjDd4t^nh~7<*hku3fUO=8E_i`8ZOG$bnE@#R~@|*8r@jn^?i(r+LeCnQ+htTNA zQ_0hecaYWw(ZCw?i(VdnfEYsr);JaJZ?LcEzY|ga$f8Mjzv%Z^l%#O`^#+zg^@~6r z;dd#TB(cp{s9uyjc&v2yFDbA}ei8f%2nG}8Fn+cB!TbCr1=hj8k^PQ{vWj=WXnx1R z|CmLC&2;M@U-U;}!e8tB3k}7e>iJs-|3ZWN=X!AesoF;_CS`XCT)^a8TWr zS`WL}xv5LwZ^!O0yekmwDQba-;L>|UA*{5A?Ay0 z>HJr-dwcx;ZBqjC1n4`f53i06`=)pNBl0npvf6HG0|dpN1#C@8gmHU|TsUw3$P`6x z_n|~?U%eLIU+OvK^~d)9_K5A%aOOLda^^b`AF}T7>dA!#j1We&3?mwX5s6^?)cw!R zJllKq}7)7P8rd2ilu+{BLaNw+eg}^n!JD83EP!7bOQl} zQelgu7M?taXl8!7<%qGM+>Mj~g$g6k#kXDFs5n<1406N-BvGMAfG$B9BByhE{GBz0 z#Dg5LVFh|gZV&KZDzJQ+;U|LVW;NbXzcs^FDsDoEF zD^Ck4C}_m1Qa{?*z53PqXS`&<;=BB*%&-1_us;1mN7=cf+3IrVSuFGT@#wMi{EClP z8eQT!HU|!t-4LYWXWF0xxB!ubUf`0fi%OA$1M9M*M$Qg4+osLGsA|JRDqvNXb zPORn4No)3!2Wxg?+0qaqBBd^3@nT2wwdN^$Tb-b&C2^W!!yb8Z6@~6yFb*chK4rw~ zkra~x*!Filj_*@YV`?~3`#0e~0qmH?w%sL2mtk@rj$oe*Z0`HfzWG(<$CmLEGc zGm?gC-6!v{OMhe{&S@HB_Cfrk>RcB1Ov8s`QtmAr#LEy zrisi=WiocRD5E1L1&k`&23v@!de@wa_fuxK&qnOi-#HljLjv{QJDlI}T>e{K89skn z{t$rh&uombxKD(MVMJc&%n$!u#)&IGMh}=`{shoSfFe_g|E!yWh@Bo$3x82ivRV;q zTMGw&xtA!)lwOD5vNm*Q`V#(@Etx6X)oA&>_8(RDQ7)7UMRHog=I;N$1qf#h{_&tZ z^=8%SRnDCI?)S`G`bJc@yT{J@e=z`*a3JH^Ze8W4b$u!b9#+(!%aKX7os>NE^J3!lt4|6I@CcxNG)321Fz) zfIcVXFBk4>L=-XDWY=EyPJL$SsUhVz8U%#mSzDQRD*oOQ_BGEO-I@v(?eL!_t~Cb>Fugp)RvJZ;f_7Tg@YL^eIe?<;qBf
EkZS5?#j%TX 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 Date: Fri, 6 Mar 2020 19:25:16 +0100 Subject: [PATCH 5/6] update readme.md for all samples Signed-off-by: Anca Iordache --- README.md | 29 +++--- samples/angular/README.md | 7 +- samples/aspnet-mssql/README.md | 14 +-- samples/nginx-flask-mongo/README.md | 71 ++++++++++++++ samples/nginx-flask-mongo/docker-compose.yaml | 2 +- samples/nginx-flask-mysql/README.md | 69 ++++++++++++++ samples/nginx-gohttp_1/Dockerfile | 11 --- samples/nginx-gohttp_1/docker-compose.yml | 14 --- samples/nginx-gohttp_2/backend/main.go | 30 ------ samples/nginx-gohttp_2/frontend/nginx.conf | 6 -- samples/nginx-golang-mysql/README.md | 79 ++++++++++++++++ samples/nginx-golang-postgres/README.md | 75 +++++++++++++++ samples/nginx-golang/README.md | 78 ++++++++++++++++ .../backend/Dockerfile | 0 .../backend}/main.go | 0 .../docker-compose.yml | 2 +- .../frontend/Dockerfile | 0 .../frontend}/nginx.conf | 0 samples/react-express-mysql/README.md | 87 ++++++++++++++++++ .../frontend/Dockerfile.production | 12 --- samples/react-java-mysql/README.md | 80 ++++++++++++++++ samples/sparkjava-mysql/README.md | 70 ++++++++++++++ samples/sparkjava-mysql/docker-compose.yaml | 1 - samples/sparkjava/README.md | 62 +++++++++++++ samples/spring-postgres/README.md | 80 ++++++++++++++++ samples/vuejs/README.md | 62 +++++++++++++ samples/vuejs/docker-compose.yaml | 2 +- samples/vuejs/output.jpg | Bin 0 -> 49708 bytes samples/vuejs/vuejs/public/favicon.ico | Bin 4286 -> 3542 bytes samples/vuejs/vuejs/src/assets/logo.png | Bin 6849 -> 39135 bytes 30 files changed, 841 insertions(+), 102 deletions(-) create mode 100644 samples/nginx-flask-mongo/README.md create mode 100644 samples/nginx-flask-mysql/README.md delete mode 100644 samples/nginx-gohttp_1/Dockerfile delete mode 100644 samples/nginx-gohttp_1/docker-compose.yml delete mode 100644 samples/nginx-gohttp_2/backend/main.go delete mode 100644 samples/nginx-gohttp_2/frontend/nginx.conf create mode 100644 samples/nginx-golang-mysql/README.md create mode 100644 samples/nginx-golang-postgres/README.md create mode 100644 samples/nginx-golang/README.md rename samples/{nginx-gohttp_2 => nginx-golang}/backend/Dockerfile (100%) rename samples/{nginx-gohttp_1 => nginx-golang/backend}/main.go (100%) rename samples/{nginx-gohttp_2 => nginx-golang}/docker-compose.yml (89%) rename samples/{nginx-gohttp_2 => nginx-golang}/frontend/Dockerfile (100%) rename samples/{nginx-gohttp_1 => nginx-golang/frontend}/nginx.conf (100%) create mode 100644 samples/react-express-mysql/README.md delete mode 100755 samples/react-express-mysql/frontend/Dockerfile.production create mode 100644 samples/react-java-mysql/README.md create mode 100644 samples/sparkjava-mysql/README.md create mode 100644 samples/sparkjava/README.md create mode 100644 samples/spring-postgres/README.md create mode 100644 samples/vuejs/README.md create mode 100644 samples/vuejs/output.jpg diff --git a/README.md b/README.md index a1e45dd..d2059db 100644 --- a/README.md +++ b/README.md @@ -22,31 +22,30 @@ The root directory of each sample contains the docker-compose.yaml describing th docker-compose up -d ``` Check the `README.md` of each sample to get more details on the structure and what is the expected output. -To stop and remove the running containers of the sample application do: +To stop and remove the all containers of the sample application run: ``` docker-compose down ``` - ## Contents *Samples of docker-compose applications with multiple integrated services:* -- [`Asp.NET/MS-SQL`](samples/aspnet-mssql/README.md) -- sample asp\\.net core application with MS SQL server database -- [`Flask / NGINX / MySQL`](samples/nginx-flask-mysql/README.md) -- sample Python/Flask application with an Nginx proxy and a MySQL database -- [`Go / NGINX / MySQL`](samples/nginx-golang-mysql/README.md) -- sample Go application with an Nginx proxy and a MySQL database -- [`Go / NGINX / PostgreSQL`](samples/nginx-golang-postgres/README.md) -- sample Go application with an Nginx proxy and a PostgreSQL database -- [`Java / MySQL`](samples/sparkjava-mysql/README.md) -- sample Java application and a MySQL database -- [`NGINX / Go`](samples/nginx-gohttp_1/README.md) -- sample Nginx application with a Go backend -- [`NGINX / Go`](samples/nginx-gohttp_2/README.md) -- another Nginx sample application with a Go backend -- [`React / Spring / MySQL`](samples/react-java-mysql/README.md) -- sample React application with a Spring backend and a MySQL database -- [`React / Express / MySQL`](samples/react-express-mysql/README.md) -- sample React application with a NodeJS backend and a MySQL database -- [`Spring / PostgreSQL`](samples/spring-postgres/README.md) -- sample Java application with Spring framework and a Postgres database - +- [`ASP.NET / MS-SQL`](samples/aspnet-mssql) -- sample ASP.NET core application with MS SQL server database +- [`Go / NGINX / MySQL`](samples/nginx-golang-mysql) -- sample Go application with an Nginx proxy and a MySQL database +- [`Go / NGINX / PostgreSQL`](samples/nginx-golang-postgres) -- sample Go application with an Nginx proxy and a PostgreSQL database +- [`Java Spark / MySQL`](samples/sparkjava-mysql) -- sample Java application and a MySQL database +- [`NGINX / Flask / MongoDB`](samples/nginx-flask-mongo) -- sample Python/Flask application with Nginx proxy and a Mongo database +- [`NGINX / Flask / MySQL`](samples/nginx-flask-mysql) -- sample Python/Flask application with an Nginx proxy and a MySQL database +- [`NGINX / Go`](samples/nginx-golang) -- sample Nginx proxy with a Go backend +- [`React / Spring / MySQL`](samples/react-java-mysql) -- sample React application with a Spring backend and a MySQL database +- [`React / Express / MySQL`](samples/react-express-mysql) -- sample React application with a NodeJS backend and a MySQL database +- [`Spring / PostgreSQL`](samples/spring-postgres) -- sample Java application with Spring framework and a Postgres database *Single service samples:* -- [`Angular`](samples/angular/README.md) -- [`VueJS`](samples/vuejs/README.md) +- [`Angular`](samples/angular) +- [`Spark`](samples/sparkjava) +- [`VueJS`](samples/vuejs) ## Contribute diff --git a/samples/angular/README.md b/samples/angular/README.md index 57f4b46..db94e60 100644 --- a/samples/angular/README.md +++ b/samples/angular/README.md @@ -1,4 +1,5 @@ -## Compose sample - Angular service +## Compose sample +### Angular service Project structure: ``` @@ -11,7 +12,7 @@ Project structure: └── docker-compose.yaml ``` -_docker-compose.yaml_ +[_docker-compose.yaml_](docker-compose.yaml) ``` version: "3.7" services: @@ -58,7 +59,7 @@ CONTAINER ID IMAGE COMMAND CREATED After the application starts, navigate to `http://localhost:80` in your web browser. -![page](https://github.com/aiordache/awesome-compose/blob/master/samples/angular/output.jpg) +![page](output.jpg) Stop and remove the container diff --git a/samples/aspnet-mssql/README.md b/samples/aspnet-mssql/README.md index 9e304d6..5095850 100644 --- a/samples/aspnet-mssql/README.md +++ b/samples/aspnet-mssql/README.md @@ -1,4 +1,4 @@ -## Compose sample - ASP.Net +## Compose sample application: ASP.NET with MS SQL server database Project structure: ``` @@ -12,17 +12,18 @@ Project structure: └── docker-compose.yaml ``` -_docker-compose.yaml_ +[_docker-compose.yaml_](docker-compose.yaml) ``` -version: "3.7" services: web: build: app ports: - 80:80 + db: + image: microsoft/mssql-server-linux ... ``` -The compose file defines an application with one service `web`. The image for the service is built with the Dockerfile inside the `app` directory (build parameter). +The compose file defines an application with two services `web` and `db`. The image for the web service is built with the Dockerfile inside the `app` directory (build parameter). When deploying the application, docker-compose maps the container port 80 to port 80 of the host as specified in the file. Make sure port 80 on the host is not being used by another container, otherwise the port should be changed. @@ -32,7 +33,6 @@ Make sure port 80 on the host is not being used by another container, otherwise ``` $ docker-compose up -d -$ compose up -d Creating network "aspnet-mssql_default" with the default driver Building web Step 1/13 : FROM mcr.microsoft.com/dotnet/core/sdk:2.1 AS build @@ -59,9 +59,9 @@ CONTAINER ID IMAGE COMMAND CREATED After the application starts, navigate to `http://localhost:80` in your web browser. -![page](https://github.com/aiordache/awesome-compose/blob/master/samples/aspnet-mssql/output.jpg) +![page](output.jpg) -Stop and remove the container +Stop and remove the containers ``` $ docker-compose down diff --git a/samples/nginx-flask-mongo/README.md b/samples/nginx-flask-mongo/README.md new file mode 100644 index 0000000..12b07c0 --- /dev/null +++ b/samples/nginx-flask-mongo/README.md @@ -0,0 +1,71 @@ +## Compose sample application +### Python/Flask application with Nginx proxy and a Mongo database + +Project structure: +``` +. +├── docker-compose.yaml +├── flask +│   ├── Dockerfile +│   ├── requirements.txt +│   └── server.py +└── nginx +    └── nginx.conf + +``` + +[_docker-compose.yaml_](docker-compose.yaml) +``` +services: + web: + build: app + ports: + - 80:80 + backend: + build: flask + ... + mongo: + image: mongo +``` +The compose file defines an application with three services `web`, `backend` and `db`. +When deploying the application, docker-compose maps port 80 of the web service container to port 80 of the host as specified in the file. +Make sure port 80 on the host is not being used by another container, otherwise the port should be changed. + +## Deploy with docker-compose + +``` +$ docker-compose up -d +Creating network "nginx-flask-mongo_default" with the default driver +Pulling mongo (mongo:)... +latest: Pulling from library/mongo +423ae2b273f4: Pull complete +... +... +Status: Downloaded newer image for nginx:latest +Creating nginx-flask-mongo_mongo_1 ... done +Creating nginx-flask-mongo_backend_1 ... done +Creating nginx-flask-mongo_web_1 ... done + +``` + +## Expected result + +Listing containers must show two containers running and the port mapping as below: +``` +$ docker ps +CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES +a0f4ebe686ff nginx "/bin/bash -c 'envsu…" About a minute ago Up About a minute 0.0.0.0:8080->80/tcp nginx-flask-mongo_web_1 +dba87a080821 nginx-flask-mongo_backend "./server.py" About a minute ago Up About a minute nginx-flask-mongo_backend_1 +d7eea5481c77 mongo "docker-entrypoint.s…" About a minute ago Up About a minute 27017/tcp nginx-flask-mongo_mongo_1 +``` + +After the application starts, navigate to `http://localhost:80` in your web browser or run: +``` +$ curl localhost:80 +Hello fom the MongoDB client! +``` + +Stop and remove the containers +``` +$ docker-compose down +``` diff --git a/samples/nginx-flask-mongo/docker-compose.yaml b/samples/nginx-flask-mongo/docker-compose.yaml index a16019f..b9cb462 100644 --- a/samples/nginx-flask-mongo/docker-compose.yaml +++ b/samples/nginx-flask-mongo/docker-compose.yaml @@ -1,4 +1,4 @@ -version: "3" +version: "3.7" services: web: image: nginx diff --git a/samples/nginx-flask-mysql/README.md b/samples/nginx-flask-mysql/README.md new file mode 100644 index 0000000..9f7060f --- /dev/null +++ b/samples/nginx-flask-mysql/README.md @@ -0,0 +1,69 @@ +## Compose sample application +### Python/Flask with Nginx proxy and MySQL database + +Project structure: +``` +. +├── docker-compose.yaml +├── flask +│   ├── Dockerfile +│   ├── requirements.txt +│   └── server.py +└── nginx +    └── nginx.conf + +``` + +[_docker-compose.yaml_](docker-compose.yaml) +``` +services: + backend: + build: backend + ... + db: + image: mysql:5.7 + ... + proxy: + build: proxy + ... +``` +The compose file defines an application with three services `proxy`, `backend` and `db`. +When deploying the application, docker-compose maps port 80 of the proxy service container to port 80 of the host as specified in the file. +Make sure port 80 on the host is not already being in use. + +## Deploy with docker-compose + +``` +$ docker-compose up -d +Creating network "nginx-flask-mysql_default" with the default driver +Pulling db (mysql:5.7)... +5.7: Pulling from library/mysql +... +... +WARNING: Image for service proxy was built because it did not already exist. To rebuild this image you must use `docker-compose build` or `docker-compose up --build`. +Creating nginx-flask-mysql_db_1 ... done +Creating nginx-flask-mysql_backend_1 ... done +Creating nginx-flask-mysql_proxy_1 ... done +``` + +## Expected result + +Listing containers must show two containers running and the port mapping as below: +``` +$ docker ps +CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES +c65ecef87e85 nginx-flask-mysql_proxy "nginx -g 'daemon of…" About a minute ago Up About a minute 0.0.0.0:80->80/tcp nginx-flask-mysql_proxy_1 +96ccc0a5342f nginx-flask-mysql_backend "/bin/sh -c 'flask r…" About a minute ago Up About a minute 5000/tcp nginx-flask-mysql_backend_1 +39327313a142 mysql:5.7 "docker-entrypoint.s…" About a minute ago Up About a minute 3306/tcp, 33060/tcp nginx-flask-mysql_db_1 +``` + +After the application starts, navigate to `http://localhost:80` in your web browser or run: +``` +$ curl localhost:80 +Hello world +``` + +Stop and remove the containers +``` +$ docker-compose down +``` diff --git a/samples/nginx-gohttp_1/Dockerfile b/samples/nginx-gohttp_1/Dockerfile deleted file mode 100644 index a9f31ce..0000000 --- a/samples/nginx-gohttp_1/Dockerfile +++ /dev/null @@ -1,11 +0,0 @@ -FROM golang:1.13 AS builder - -WORKDIR /compose/hello-docker -COPY main.go main.go -RUN CGO_ENABLED=0 go build -o backend main.go - -FROM scratch -COPY --from=builder /compose/hello-docker/backend /usr/local/bin/backend -CMD ["/usr/local/bin/backend"] - - diff --git a/samples/nginx-gohttp_1/docker-compose.yml b/samples/nginx-gohttp_1/docker-compose.yml deleted file mode 100644 index ea55443..0000000 --- a/samples/nginx-gohttp_1/docker-compose.yml +++ /dev/null @@ -1,14 +0,0 @@ - -version: "3.6" -services: - frontend: - image: nginx - ports: - - 8080:80 - volumes: - - ./nginx.conf:/etc/nginx/conf.d/default.conf - depends_on: - - backend - backend: - build: . - diff --git a/samples/nginx-gohttp_2/backend/main.go b/samples/nginx-gohttp_2/backend/main.go deleted file mode 100644 index a273432..0000000 --- a/samples/nginx-gohttp_2/backend/main.go +++ /dev/null @@ -1,30 +0,0 @@ -package main - -import ( - "fmt" - "log" - "net/http" -) - -func handler(w http.ResponseWriter, r *http.Request) { - fmt.Println(r.URL.RawQuery) - fmt.Fprintf(w, ` - ## . - ## ## ## == - ## ## ## ## ## === -/"""""""""""""""""\___/ === -{ / ===- -\______ O __/ - \ \ __/ - \____\_______/ - - -Hello from Docker! - -`) -} - -func main() { - http.HandleFunc("/", handler) - log.Fatal(http.ListenAndServe(":80", nil)) -} diff --git a/samples/nginx-gohttp_2/frontend/nginx.conf b/samples/nginx-gohttp_2/frontend/nginx.conf deleted file mode 100644 index 910b45b..0000000 --- a/samples/nginx-gohttp_2/frontend/nginx.conf +++ /dev/null @@ -1,6 +0,0 @@ -server { - listen 80; - location / { - proxy_pass http://backend:80; - } -} \ No newline at end of file diff --git a/samples/nginx-golang-mysql/README.md b/samples/nginx-golang-mysql/README.md new file mode 100644 index 0000000..bbfd838 --- /dev/null +++ b/samples/nginx-golang-mysql/README.md @@ -0,0 +1,79 @@ +## Compose sample application +### Go server with an Nginx proxy and a MySQL database + +Project structure: +``` +. +├── backend +│   ├── Dockerfile +│   ├── go.mod +│   └── main.go +├── db +│   └── password.txt +├── docker-compose.yaml +├── proxy +│   ├── conf +│   └── Dockerfile +└── README.md +``` + +[_docker-compose.yaml_](docker-compose.yaml) +``` +services: + backend: + build: backend + ... + db: + image: mysql:5.7 + ... + proxy: + build: proxy + ports: + - 80:80 + ... +``` +The compose file defines an application with three services `proxy`, `backend` and `db`. +When deploying the application, docker-compose maps port 80 of the proxy service container to port 80 of the host as specified in the file. +Make sure port 80 on the host is not already being in use. + +## Deploy with docker-compose + +``` +$ docker-compose up -d +Creating network "nginx-golang-mysql_default" with the default driver +Building backend +Step 1/8 : FROM golang:1.13-alpine AS build +1.13-alpine: Pulling from library/golang +... +Successfully built 5f7c899f9b49 +Successfully tagged nginx-golang-mysql_proxy:latest +WARNING: Image for service proxy was built because it did not already exist. To rebuild this image you must use `docker-compose build` or `docker-compose up --build`. +Creating nginx-golang-mysql_db_1 ... done +Creating nginx-golang-mysql_backend_1 ... done +Creating nginx-golang-mysql_proxy_1 ... done +``` + +## Expected result + +Listing containers must show two containers running and the port mapping as below: +``` +$ docker ps +CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES +8906b14c5ad1 nginx-golang-mysql_proxy "nginx -g 'daemon of…" 2 minutes ago Up 2 minutes 0.0.0.0:80->80/tcp nginx-golang-mysq +l_proxy_1 +13e0e0a7715a nginx-golang-mysql_backend "/server" 2 minutes ago Up 2 minutes 8000/tcp nginx-golang-mysq +l_backend_1 +ca8c5975d205 mysql:5.7 "docker-entrypoint.s…" 2 minutes ago Up 2 minutes 3306/tcp, 33060/tcp nginx-golang-mysq +l_db_1 +``` + +After the application starts, navigate to `http://localhost:80` in your web browser or run: +``` +$ curl localhost:80 +["Blog post #0","Blog post #1","Blog post #2","Blog post #3","Blog post #4"] +``` + +Stop and remove the containers +``` +$ docker-compose down +``` diff --git a/samples/nginx-golang-postgres/README.md b/samples/nginx-golang-postgres/README.md new file mode 100644 index 0000000..e3f8ae7 --- /dev/null +++ b/samples/nginx-golang-postgres/README.md @@ -0,0 +1,75 @@ +## Compose sample application +### Go server with an Nginx proxy and a Postgres database + +Project structure: +``` +. +├── backend +│   ├── Dockerfile +│   ├── go.mod +│   └── main.go +├── db +│   └── password.txt +├── docker-compose.yaml +├── proxy +│   ├── conf +│   └── Dockerfile +└── README.md +``` + +[_docker-compose.yaml_](docker-compose.yaml) +``` +services: + backend: + build: backend + ... + db: + image: postgres + ... + proxy: + build: proxy + ports: + - 80:80 + ... +``` +The compose file defines an application with three services `proxy`, `backend` and `db`. +When deploying the application, docker-compose maps port 80 of the proxy service container to port 80 of the host as specified in the file. +Make sure port 80 on the host is not already being in use. + +## Deploy with docker-compose + +``` +$ docker-compose up -d +Creating network "nginx-golang-postgres_default" with the default driver +Pulling db (postgres:)... +latest: Pulling from library/postgres +... +Successfully built 5f7c899f9b49 +Successfully tagged nginx-golang-postgres_proxy:latest +WARNING: Image for service proxy was built because it did not already exist. To rebuild this image you must use `docker-compose build` or `docker-compose up --build`. +Creating nginx-golang-postgres_db_1 ... done +Creating nginx-golang-postgres_backend_1 ... done +Creating nginx-golang-postgres_proxy_1 ... done +``` + +## Expected result + +Listing containers must show two containers running and the port mapping as below: +``` +$ docker ps +CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES +5e3ecd0289c0 nginx-golang-postgres_proxy "nginx -g 'daemon of…" 48 seconds ago Up 48 seconds 0.0.0.0:80->80/tcp nginx-golang-postgres_proxy_1 +ffa1410b1c8a nginx-golang-postgres_backend "/server" 49 seconds ago Up 48 seconds 8000/tcp nginx-golang-postgres_backend_1 +e63be7db7cbc postgres "docker-entrypoint.s…" 49 seconds ago Up 49 seconds 5432/tcp nginx-golang-postgres_db_1 +``` + +After the application starts, navigate to `http://localhost:80` in your web browser or run: +``` +$ curl localhost:80 +["Blog post #0","Blog post #1","Blog post #2","Blog post #3","Blog post #4"] +``` + +Stop and remove the containers +``` +$ docker-compose down +``` diff --git a/samples/nginx-golang/README.md b/samples/nginx-golang/README.md new file mode 100644 index 0000000..2946f1d --- /dev/null +++ b/samples/nginx-golang/README.md @@ -0,0 +1,78 @@ +## Compose sample application +### NGINX proxy with GO backend + +Project structure: +``` +. +├── backend +│   ├── Dockerfile +│   └── main.go +├── docker-compose.yml +├── frontend +│   ├── Dockerfile +│   └── nginx.conf +└── README.md +``` + +[_docker-compose.yaml_](docker-compose.yaml) +``` +version: "3.7" +services: + frontend: + build: frontend + ports: + - 8080:80 + backend: + build: backend +``` +The compose file defines an application with two services `frontend` and `backend`. +When deploying the application, docker-compose maps port 80 of the frontend service container to port 8080 of the host as specified in the file. +Make sure port 8080 on the host is not already being in use. + +## Deploy with docker-compose + +``` +$ docker-compose up -d +Creating network "nginx-golang_default" with the default driver +Building backend +Step 1/7 : FROM golang:1.13 AS build +1.13: Pulling from library/golang +... +Successfully built 4b24f27138cc +Successfully tagged nginx-golang_frontend:latest +WARNING: Image for service frontend was built because it did not already exist. To rebuild this image you must use `docker-compose build` or `docker-compose up --build`. +Creating nginx-golang_backend_1 ... done +Creating nginx-golang_frontend_1 ... done +``` + +## Expected result + +Listing containers must show two containers running and the port mapping as below: +``` +$ docker ps +CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES +8bd5b0d78e73 nginx-golang_frontend "nginx -g 'daemon of…" 53 seconds ago Up 52 seconds 0.0.0.0:8080->80/tcp nginx-golang_frontend_1 +56f929c240a0 nginx-golang_backend "/usr/local/bin/back…" 53 seconds ago Up 53 seconds nginx-golang_backend_1 +``` + +After the application starts, navigate to `http://localhost:8080` in your web browser or run: +``` +$ curl localhost:8080 + + ## . + ## ## ## == + ## ## ## ## ## === +/"""""""""""""""""\___/ === +{ / ===- +\______ O __/ + \ \ __/ + \____\_______/ + + +Hello from Docker! +``` + +Stop and remove the containers +``` +$ docker-compose down +``` diff --git a/samples/nginx-gohttp_2/backend/Dockerfile b/samples/nginx-golang/backend/Dockerfile similarity index 100% rename from samples/nginx-gohttp_2/backend/Dockerfile rename to samples/nginx-golang/backend/Dockerfile diff --git a/samples/nginx-gohttp_1/main.go b/samples/nginx-golang/backend/main.go similarity index 100% rename from samples/nginx-gohttp_1/main.go rename to samples/nginx-golang/backend/main.go diff --git a/samples/nginx-gohttp_2/docker-compose.yml b/samples/nginx-golang/docker-compose.yml similarity index 89% rename from samples/nginx-gohttp_2/docker-compose.yml rename to samples/nginx-golang/docker-compose.yml index 1bd5626..177c2ef 100644 --- a/samples/nginx-gohttp_2/docker-compose.yml +++ b/samples/nginx-golang/docker-compose.yml @@ -1,5 +1,5 @@ -version: "3.6" +version: "3.7" services: frontend: build: frontend diff --git a/samples/nginx-gohttp_2/frontend/Dockerfile b/samples/nginx-golang/frontend/Dockerfile similarity index 100% rename from samples/nginx-gohttp_2/frontend/Dockerfile rename to samples/nginx-golang/frontend/Dockerfile diff --git a/samples/nginx-gohttp_1/nginx.conf b/samples/nginx-golang/frontend/nginx.conf similarity index 100% rename from samples/nginx-gohttp_1/nginx.conf rename to samples/nginx-golang/frontend/nginx.conf diff --git a/samples/react-express-mysql/README.md b/samples/react-express-mysql/README.md new file mode 100644 index 0000000..c87194a --- /dev/null +++ b/samples/react-express-mysql/README.md @@ -0,0 +1,87 @@ +## Compose sample application +### React application with a NodeJS backend and a MySQL database + +Project structure: +``` +. +├── backend +│   ├── Dockerfile +│   ... +├── db +│   └── password.txt +├── docker-compose.yaml +├── frontend +│   ├── ... +│   └── Dockerfile +└── README.md +``` + +[_docker-compose.yaml_](docker-compose.yaml) +``` +services: + backend: + build: backend + ... + db: + image: postgres + ... + frontend: + build: frontend + ports: + - 80:9000 + ... +``` +The compose file defines an application with three services `frontend`, `backend` and `db`. +When deploying the application, docker-compose maps port 80 of the frontend service container to port 9000 of the host as specified in the file. +Make sure port 80 on the host is not already being in use. + +## Deploy with docker-compose + +``` +$ docker-compose up -d +Creating network "react-express-mysql_default" with the default driver +Building backend +Step 1/16 : FROM node:10 + ---> aa6432763c11 +... +Successfully tagged react-express-mysql_frontend:latest +WARNING: Image for service frontend was built because it did not already exist. To rebuild this image you must use `docker-compose build` or `docker-compose up --build`. +Creating react-express-mysql_db_1 ... done +Creating react-express-mysql_backend_1 ... done +Creating react-express-mysql_frontend_1 ... done +``` + +## Expected result + +Listing containers must show two containers running and the port mapping as below: +``` +$ docker ps +CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES +5e3ecd0289c0 nginx-golang-postgres_proxy "nginx -g 'daemon of…" 48 seconds ago Up 48 seconds 0.0.0.0:80->80/tcp nginx-golang-postgres_proxy_1 +ffa1410b1c8a nginx-golang-postgres_backend "/server" 49 seconds ago Up 48 seconds 8000/tcp nginx-golang-postgres_backend_1 +e63be7db7cbc postgres "docker-entrypoint.s…" 49 seconds ago Up 49 seconds 5432/tcp nginx-golang-postgres_db_1 +``` + +After the application starts, navigate to `http://localhost:80` in your web browser to get a colorful message. +``` +My New React App +``` + +The backend service container has the port 80 mapped to 8080 on the host. +``` +$ curl localhost:8080 +Hello Docker World +``` + +Stop and remove the containers +``` +$ docker-compose down +Stopping react-express-mysql_frontend_1 ... done +Stopping react-express-mysql_backend_1 ... done +Stopping react-express-mysql_db_1 ... done +Removing react-express-mysql_frontend_1 ... done +Removing react-express-mysql_backend_1 ... done +Removing react-express-mysql_db_1 ... done +Removing network react-express-mysql_default + +``` diff --git a/samples/react-express-mysql/frontend/Dockerfile.production b/samples/react-express-mysql/frontend/Dockerfile.production deleted file mode 100755 index 85b11ed..0000000 --- a/samples/react-express-mysql/frontend/Dockerfile.production +++ /dev/null @@ -1,12 +0,0 @@ -FROM node:10 as build - -RUN mkdir /project -WORKDIR /project -COPY . . -RUN yarn install -RUN yarn run package - -FROM nginx:1.13-alpine - -COPY config/nginx.conf /etc/nginx/conf.d/default.conf -COPY --from=build /project/dist /usr/share/nginx/html diff --git a/samples/react-java-mysql/README.md b/samples/react-java-mysql/README.md new file mode 100644 index 0000000..cbc7370 --- /dev/null +++ b/samples/react-java-mysql/README.md @@ -0,0 +1,80 @@ +## Compose sample application +### React application with a NodeJS backend and a MySQL database + +Project structure: +``` +. +├── backend +│   ├── Dockerfile +│   ... +├── db +│   └── password.txt +├── docker-compose.yaml +├── frontend +│   ├── ... +│   └── Dockerfile +└── README.md +``` + +[_docker-compose.yaml_](docker-compose.yaml) +``` +services: + backend: + build: backend + ... + db: + image: mysql:5.7 + ... + frontend: + build: frontend + ports: + - 80:9000 + ... +``` +The compose file defines an application with three services `frontend`, `backend` and `db`. +When deploying the application, docker-compose maps port 80 of the frontend service container to port 9000 of the host as specified in the file. +Make sure port 80 on the host is not already being in use. + +## Deploy with docker-compose + +``` +$ docker-compose up -d +Creating network "react-java-mysql_default" with the default driver +Building backend +Step 1/10 : FROM maven:3.5-jdk-9 AS build +... +Successfully tagged react-java-mysql_frontend:latest +WARNING: Image for service frontend was built because it did not already exist. To rebuild this image you must use `docker-compose build` or `docker-compose up --build`. +Creating react-java-mysql_frontend_1 ... done +Creating react-java-mysql_db_1 ... done +Creating react-java-mysql_backend_1 ... done +``` + +## Expected result + +Listing containers must show two containers running and the port mapping as below: +``` +$ docker ps +ONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES +a63dee74d79e react-java-mysql_backend "java -Djava.securit…" 39 seconds ago Up 37 seconds react-java-mysql_backend_1 +6a7364c0812e react-java-mysql_frontend "docker-entrypoint.s…" 39 seconds ago Up 33 seconds 0.0.0.0:80->9000/tcp react-java-mysql_frontend_1 +b176b18fbec4 mysql:5.7 "docker-entrypoint.s…" 39 seconds ago Up 37 seconds 3306/tcp, 33060/tcp react-java-mysql_db_1 +e63be7db7cbc postgres "docker-entrypoint.s…" 2 hours ago Up 16 minutes 5432/tcp nginx-golang-postgres_db_1 +``` + +After the application starts, navigate to `http://localhost:80` in your web browser to get a colorful message. +``` +My New React App +``` + +Stop and remove the containers +``` +$ docker-compose down +Stopping react-java-mysql_backend_1 ... done +Stopping react-java-mysql_frontend_1 ... done +Stopping react-java-mysql_db_1 ... done +Removing react-java-mysql_backend_1 ... done +Removing react-java-mysql_frontend_1 ... done +Removing react-java-mysql_db_1 ... done +Removing network react-java-mysql_default +``` diff --git a/samples/sparkjava-mysql/README.md b/samples/sparkjava-mysql/README.md new file mode 100644 index 0000000..095e8de --- /dev/null +++ b/samples/sparkjava-mysql/README.md @@ -0,0 +1,70 @@ +## Compose sample application +### Java Spark application with MySQL database + +Project structure: +``` +. +├── backend +│   ├── Dockerfile +│   └── ... +├── db +│   └── password.txt +├── docker-compose.yaml +└── README.md + +``` + +[_docker-compose.yaml_](docker-compose.yaml) +``` +version: "3.7" +services: + backend: + build: backend + ports: + - 80:8080 + db: + image: mysql:5.7 + ... +``` +The compose file defines an application with two services `backend` and `db`. +When deploying the application, docker-compose maps port 8080 of the backend service container to port 80 of the host as specified in the file. +Make sure port 80 on the host is not already being in use. + +## Deploy with docker-compose + +``` +$ docker-compose up -d +Creating network "sparkjava-mysql_default" with the default driver +Building backend +... +Successfully tagged sparkjava-mysql_backend:latest +WARNING: Image for service backend was built because it did not already exist. To rebuild this image you must use `docker-compose build` or `docker-compose up --build`. +Creating sparkjava-mysql_db_1 ... done +Creating sparkjava-mysql_backend_1 ... done +``` + +## Expected result + +Listing containers must show two containers running and the port mapping as below: +``` +$ docker ps +CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES +ee1e4f05d9f6 sparkjava-mysql_backend "/bin/sh -c 'java -j…" 44 seconds ago Up 43 seconds 0.0.0.0:80->8080/tcp sparkjava-mysql_backend_1 +716025ddf65b mysql:5.7 "docker-entrypoint.s…" 44 seconds ago Up 43 seconds 3306/tcp, 33060/tcp sparkjava-mysql_db_1 +``` + +After the application starts, run: +``` +$ curl localhost:80 +["Blog post #0","Blog post #1","Blog post #2","Blog post #3","Blog post #4"] +``` + +Stop and remove the containers +``` +$ docker-compose down +Stopping sparkjava-mysql_backend_1 ... done +Stopping sparkjava-mysql_db_1 ... done +Removing sparkjava-mysql_backend_1 ... done +Removing sparkjava-mysql_db_1 ... done +Removing network sparkjava-mysql_default +``` diff --git a/samples/sparkjava-mysql/docker-compose.yaml b/samples/sparkjava-mysql/docker-compose.yaml index 647c1f3..019ab4c 100644 --- a/samples/sparkjava-mysql/docker-compose.yaml +++ b/samples/sparkjava-mysql/docker-compose.yaml @@ -2,7 +2,6 @@ version: "3.7" services: backend: build: backend - image: docker.io/docker/back ports: - 80:8080 secrets: diff --git a/samples/sparkjava/README.md b/samples/sparkjava/README.md new file mode 100644 index 0000000..4905643 --- /dev/null +++ b/samples/sparkjava/README.md @@ -0,0 +1,62 @@ +## Compose sample application +### Spark Java + +Project structure: +``` +. +├── docker-compose.yaml +├── README.md +└── sparkjava + ├── Dockerfile + └── ... +``` + +[_docker-compose.yaml_](docker-compose.yaml) +``` +version: "3.7" +services: + sparkjava: + build: sparkjava + ports: + - 80:8080 +``` +The compose file defines an application with one service `sparkjava`. +When deploying the application, docker-compose maps port 8080 of the sparkjava service container to port 80 of the host as specified in the file. +Make sure port 80 on the host is not already being in use. + +## Deploy with docker-compose + +``` +$ docker-compose up -d +Creating network "sparkjava_default" with the default driver +Building sparkjava +Step 1/9 : FROM maven:3.5-jdk-8-alpine AS build +3.5-jdk-8-alpine: Pulling from library/maven +... +Successfully tagged sparkjava_sparkjava:latest +WARNING: Image for service sparkjava was built because it did not already exist. To rebuild this image you must use `docker-compose build` or `docker-compose up --build`. +Creating sparkjava_sparkjava_1 ... done +``` + +## Expected result + +Listing containers must show two containers running and the port mapping as below: +``` +$ docker ps +CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES +5af94cb25394 sparkjava_sparkjava "/bin/sh -c 'java -j…" 20 seconds ago Up 19 seconds 0.0.0.0:80->8080/tcp sparkjava_sparkjava_1 +``` + +After the application starts, navigate to `http://localhost:80` in your web browser or run: +``` +$ curl localhost:80 +Hello world +``` + +Stop and remove the containers +``` +$ docker-compose down +Stopping sparkjava_sparkjava_1 ... done +Removing sparkjava_sparkjava_1 ... done +Removing network sparkjava_default +``` diff --git a/samples/spring-postgres/README.md b/samples/spring-postgres/README.md new file mode 100644 index 0000000..c146d5d --- /dev/null +++ b/samples/spring-postgres/README.md @@ -0,0 +1,80 @@ +## Compose sample application +### Java application with Spring framework and a Postgres database + +Project structure: +``` +. +├── backend +│   ├── Dockerfile +│   └── ... +├── db +│   └── password.txt +├── docker-compose.yaml +└── README.md + +``` + +[_docker-compose.yaml_](docker-compose.yaml) +``` +version: "3.7" +services: + backend: + build: backend + ports: + - 80:8080 + db: + image: postgres + ... +``` +The compose file defines an application with two services `backend` and `db`. +When deploying the application, docker-compose maps port 8080 of the backend service container to port 80 of the host as specified in the file. +Make sure port 80 on the host is not already being in use. + +## Deploy with docker-compose + +``` +$ docker-compose up -d +Creating network "spring-postgres_default" with the default driver +Building backend +Step 1/11 : FROM maven:3.5-jdk-9 AS build +3.5-jdk-9: Pulling from library/maven +... +Successfully tagged spring-postgres_backend:latest +WARNING: Image for service backend was built because it did not already exist. To rebuild this image you must use `docker-compose build` or `docker-compose up --build`. +Creating spring-postgres_backend_1 ... done +Creating spring-postgres_db_1 ... done +``` + +## Expected result + +Listing containers must show two containers running and the port mapping as below: +``` +$ docker ps +CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES +56236f640eaa postgres "docker-entrypoint.s…" 29 seconds ago Up 28 seconds 5432/tcp spring-postgres_db_1 +6e69472dc2c0 spring-postgres_backend "java -Djava.securit…" 29 seconds ago Up 28 seconds 0.0.0.0:80->8080/tcp spring-postgres_backend_1 +``` + +After the application starts, navigate to `http://localhost:80` in your web browse or run: +``` +$ curl localhost:80 + + + + Getting Started: Serving Web Content + + + +

Hello from Docker!

+ +``` + +Stop and remove the containers +``` +$ docker-compose down +Stopping spring-postgres_db_1 ... done +Stopping spring-postgres_backend_1 ... done +Removing spring-postgres_db_1 ... done +Removing spring-postgres_backend_1 ... done +Removing network spring-postgres_default +``` diff --git a/samples/vuejs/README.md b/samples/vuejs/README.md new file mode 100644 index 0000000..19fbf94 --- /dev/null +++ b/samples/vuejs/README.md @@ -0,0 +1,62 @@ +## Compose sample application +### VueJS + +Project structure: +``` +. +├── docker-compose.yaml +├── README.md +└── vuejs + ├── Dockerfile + └── ... +``` + +[_docker-compose.yaml_](docker-compose.yaml) +``` +version: "3.7" +services: + web: + build: vuejs + ports: + - 80:8080 + volumes: + - ./vuejs:/project + - /project/node_modules +``` +The compose file defines an application with one service `sparkjava`. +When deploying the application, docker-compose maps port 8080 of the web service container to port 80 of the host as specified in the file. +Make sure port 80 on the host is not already being in use. + +## Deploy with docker-compose + +``` +$ docker-compose up -d +Creating network "vuejs_default" with the default driver +Building web +Step 1/8 : FROM node:10 +... +Successfully tagged vuejs_web:latest +WARNING: Image for service web was built because it did not already exist. To rebuild this image you must use `docker-compose build` or `docker-compose up --build`. +Creating vuejs_web_1 ... done +``` + +## Expected result + +Listing containers must show two containers running and the port mapping as below: +``` +$ docker ps +CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES +701c02bb97b1 vuejs_web "docker-entrypoint.s…" 49 seconds ago Up 46 seconds 0.0.0.0:80->8080/tcp vuejs_web_1 +``` + +After the application starts, navigate to `http://localhost:80` in your web browser. + +![page](output.jpg) + +Stop and remove the containers +``` +$ docker-compose down +Stopping vuejs_web_1 ... done +Removing vuejs_web_1 ... done +Removing network vuejs_default +``` diff --git a/samples/vuejs/docker-compose.yaml b/samples/vuejs/docker-compose.yaml index 973fd44..5874758 100644 --- a/samples/vuejs/docker-compose.yaml +++ b/samples/vuejs/docker-compose.yaml @@ -1,6 +1,6 @@ version: "3.7" services: - vuejs: + web: build: vuejs ports: - 80:8080 diff --git a/samples/vuejs/output.jpg b/samples/vuejs/output.jpg new file mode 100644 index 0000000000000000000000000000000000000000..e0632b08133264934eb52eaa48d085743597fd70 GIT binary patch literal 49708 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 QF#rGn07*qoM6N<$f-gE^#{d8T literal 4286 zcmds*O-Phc6o&64GDVCEQHxsW(p4>LW*W<827=Unuo8sGpRux(DN@jWP-e29Wl%wj zY84_aq9}^Am9-cWTD5GGEo#+5Fi2wX_P*bo+xO!)p*7B;iKlbFd(U~_d(U?#hLj56 zPhFkj-|A6~Qk#@g^#D^U0XT1cu=c-vu1+SElX9NR;kzAUV(q0|dl0|%h|dI$%VICy zJnu2^L*Te9JrJMGh%-P79CL0}dq92RGU6gI{v2~|)p}sG5x0U*z<8U;Ij*hB9z?ei z@g6Xq-pDoPl=MANPiR7%172VA%r)kevtV-_5H*QJKFmd;8yA$98zCxBZYXTNZ#QFk2(TX0;Y2dt&WitL#$96|gJY=3xX zpCoi|YNzgO3R`f@IiEeSmKrPSf#h#Qd<$%Ej^RIeeYfsxhPMOG`S`Pz8q``=511zm zAm)MX5AV^5xIWPyEu7u>qYs?pn$I4nL9J!=K=SGlKLXpE<5x+2cDTXq?brj?n6sp= zphe9;_JHf40^9~}9i08r{XM$7HB!`{Ys~TK0kx<}ZQng`UPvH*11|q7&l9?@FQz;8 zx!=3<4seY*%=OlbCbcae?5^V_}*K>Uo6ZWV8mTyE^B=DKy7-sdLYkR5Z?paTgK-zyIkKjIcpyO z{+uIt&YSa_$QnN_@t~L014dyK(fOOo+W*MIxbA6Ndgr=Y!f#Tokqv}n<7-9qfHkc3 z=>a|HWqcX8fzQCT=dqVbogRq!-S>H%yA{1w#2Pn;=e>JiEj7Hl;zdt-2f+j2%DeVD zsW0Ab)ZK@0cIW%W7z}H{&~yGhn~D;aiP4=;m-HCo`BEI+Kd6 z={Xwx{TKxD#iCLfl2vQGDitKtN>z|-AdCN|$jTFDg0m3O`WLD4_s#$S diff --git a/samples/vuejs/vuejs/src/assets/logo.png b/samples/vuejs/vuejs/src/assets/logo.png index f3d2503fc2a44b5053b0837ebea6e87a2d339a43..9bc5eb2f9e5051601aa8628f194932c8001e26cd 100644 GIT binary patch literal 39135 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

ZMMXuk0bu&{>G&2jGzl-i{PG>Sxw+5V?T)ML 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 UaBka@*8l(j07*qoM6N<$f^aN~WB>pF literal 6849 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 Date: Fri, 6 Mar 2020 20:47:18 +0100 Subject: [PATCH 6/6] Update README.md --- samples/react-express-mysql/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/samples/react-express-mysql/README.md b/samples/react-express-mysql/README.md index c87194a..55e1af5 100644 --- a/samples/react-express-mysql/README.md +++ b/samples/react-express-mysql/README.md @@ -23,7 +23,7 @@ services: build: backend ... db: - image: postgres + image: mysql:5.7 ... frontend: build: frontend