มาเขียน dotnet core โดยไม่ต้องลง dotnet SDK + Google Cloud Builds !!!

ห่างหายไปนานจากการเขียน blog เพราะว่าต้องไป join Engineering Bootcampm ที่ Menlo Park แล้วยังต้องเหนื่อยกับการ relocation อีกต่างหาก ตอนนี้ก็ยังย้ายของไม่เสร็จ แต่ชีวิตเริ่มมีเวลามากขึ้นบ้างแล้ว ก็เลยมาเขียน blog สักหน่อยดีกว่า

เรื่องของเรื่องคือ วันนี้ไปงาน meetup มา เป็น workshop เล็กๆ เกี่ยวกับ CI/CD และต้องใช้ dotnet core ทีนี้ผมก็เตรียม dotnet SDK ไปจากบ้านอย่างเรียบร้อยเลย ปัญหาคือ พอมาถึง workshop ก็พบว่า version ไม่ตรงกัน TADA !!! เลยทำให้ทำ workshop ต่อไปไม่ได้ อยากทำ workshop ก็อยาก แต่ไม่อยากลง dotnet SDK ใหม่ให้เป็นมลทินกับ macbook pro เครื่องใหม่ ทำไงดี !!!!

หยุดคิดไป 0.29 nanosec ก็ตัดสินใจว่า เอาวะ docker ละกัน ก็เลยลงมือเลย เนื่องจาก workshop ต้องใช้ dotnet sdk 2.0.201 เพราะว่า template ที่ใช้ในเวอร์ชันล่าสุดไม่ตรงกับที่ workshop ต้องการ ก็เริ่มจากการ pull image มาก่อน

docker pull microsoft/dotnet:2.0-sdk

1_a8_RLGtopnaUaBHEGEnzDA

รอพี่แก pull image แปปนึงนะครับ
หลังจากนั้นก็เริ่มทำการสร้าง project ได้เลย ด้วยคำสั่งนี้ครับ

docker run -v ${PWD}:/work -w /work microsoft/dotnet:2.0-sdk dotnet new react --name <your-peoject-name>

เนื่องจากเราต้องการให้ dotnet CLI สร้าง project เพื่อเอามาใช้งานใน host machine เพื่อที่จะสามารถเขียน code และ run project ที่จะใช้ใน workshop ต่อได้

1_bXtTpJ2RRjRqhgLsAxmB1Q

เย่ ๆ ได้ละ
ทีนี้ เราก็มาทำ Dockerfile เพื่อให้เราสามารถรัน project นี้ด้วย docker ได้กัน

FROM microsoft/dotnet:2.0-sdk AS builder
WORKDIR /source
RUN curl -sL https://deb.nodesource.com/setup_10.x |  bash -
RUN apt-get install -y nodejs
COPY *.csproj .
RUN dotnet restore
COPY ./ ./
RUN dotnet publish "./myProj.csproj" --output "./dist" --configuration Release --no-restore
FROM microsoft/dotnet:2.1.1-aspnetcore-runtime
WORKDIR /app
COPY --from=builder /source/dist .
EXPOSE 80
ENTRYPOINT ["dotnet", "myProj.dll"]

Protips #1: อย่าลืมเพิ่ม .dockerignore เพราะว่าอาจทำให้มีปัญหาจากการ build ได้ เช่น node_module ที่ไม่ up-to-date

**/obj/
**/bin/
**/node_modules/

ในการ build docker image นั้นก็สามารถ build ได้ตามปกติเลยนะครับ

docker build -t myproj/v0.4 .

และ เราก็สามารถรัน asp.net core website ได้เลยด้วยคำสั่งต่อไปนี้ !!

docker run -p 80:80  myproj/v0.4

Build success !!!

1_IOt-VGHPVzN9DvqJuXg-Rg

เย่ รันได้ !!!
Protips #2: ถ้ามีปัญหาในการรัน docker image ที่ build ลองเพิ่ม property นี้ลงใน

<PublishWithAspNetCoreTargetManifest>false</PublishWithAspNetCoreTargetManifest>

Option เสริม มาเพิ่มการ build แบบคูลๆด้วย Google Cloud Builds กัน (ในส่วนของการ enable cloud builds API ไปอ่านกันเองที่นี่นะครับ => https://cloud.google.com/cloud-build/docs/quickstart-docker

ในที่นี้เรามี Dockerfile อยู่แล้ว ก็มาลองใช้ gcloud builds กันดีกว่า ในการสั่ง build ด้วย gcloud builds นั้นก็ไม่ต่างจากคำสั่งที่เรา build เองมากนัก

gcloud builds submit --tag gcr.io/<gcloud-project-id>/<image-name> .

1__tdqyR_X7gXE6cx_X952Dg

build ใน google cloud เร็วระห่ำมาก
และ เมื่อ build เสร็จก็รันได้เลย แต่อย่าลืมตั้งค่าให้ docker รู้จัก repo ของ gcloud ด้วยคำสั่ง

gcloud auth configure-docker

ทีนี้ก็รันได้เลย !!!

docker run -p 80:80 gcr.io/<project-id>/<image-name>

1_NZdcFnCMFiVSJm1cZxhMDA

OMG OMG OMG OMG OMG

Happy Coding krub