只有累積,沒有奇蹟

2019年1月30日 星期三

[Docker] Image operating system "windows" cannot be used on this platform

問題
接獲同事詢問在安裝完 Docker for Windows 之後,練習指令 docker pull image 時候跳出異常訊息,訊息內容為 image operating system "windows" cannot be used on this platform ,回想起自己一開始觀念不熟悉時也發生過類似問題,錯誤訊息如下所示
PS C:\marcustung> docker pull someone/image:latest
latest: Pulling from someone/image
65014b3c3121: Pulling fs layer
1329b41e943f: Waiting
image operating system "windows" cannot be used on this platform
解決方案
在 Windows 10 周年的更新時宣布新增 Container 功能,透過安裝步驟可以在 Windows 10 上使用 Docker 運行 Linux 或是 Windows 容器,但無法同時運行兩種引擎,如果要切換可以透過 Docker for windows 的選單功能或是下指令進行切換引擎的動作,那麼如何知道目前使用什麼引擎呢 ? 可以透過指令  docker version 得知目前使用的引擎,如下圖所示紅色框框處顯示為 Linux/amd64
接著從錯誤訊息可以得知,所要執行 image 僅能在 window docker上跑,因此所要進行的動作很簡單就是把引擎切換到 windows 上 ( 預設安裝完會跑 Linux ),有兩種方式可以切換
使用指令
透過指令進行切換 
& $Env:ProgramFiles\Docker\Docker\DockerCli.exe -SwitchDaemon .
透過選單
在 Docker 選單按右鍵 > switch to windows container 
接著會跳出提示在切換期間無法管理 container,按下 switch 繼續 
看到鯨魚在一直游泳游泳游泳,然後就完成了
建議直接打指令方式切換,速度上與第二種差很多 XDD
切換完畢之後再透過指令 docker version 確認是否切換成功,已順利切換為 windows container
接著在重新 pull 稍早失敗的 image 即可正常
Happy coding !!

參考
build-your-first-docker-windows-server-container
run-linux-and-windows-containers-on-windows-10

2019年1月29日 星期二

[Docker] Docker for windows 初體驗

前言
Docker 是一個 open source 專案,誕生於 2013 年初,Docker 屬於 Linux 容器的一種封裝,提供了簡單且易用的容器接口,在 2016 推出 Docker for windows 版本,相信大家或多或少都聽過甚至已經有在使用,自己也接觸過 docker 一小段時間,但都屬於玩票性質未好好研究,或許在新筆電重新安裝的時候是一個好契機可以靜下心來深入研究,以下簡單介紹 Docker 在 Windows 上的安裝流程

安裝 Docker for Windows
Step 1 : 首先進入到 Docker 官網 下載 Docker Desktop for windows,我選擇下載 Stable 版本
Step 2 : 下載 Docker Windows Installer 安裝檔到 download 資料夾,接著點擊執行檔
Step 3 : 在安裝前會先詢問是否要建立快捷鍵在桌面及預設用 Linux container (設定安裝完可以再修改)
Step 4 : 按下OK後接著會進行目前穩定的 Docker 2.0.0.2 版安裝 ( 2019/1)
 
Step 5 : 安裝完後安裝程式會偵測電腦的 Hyper-V 和 Containers 功能是否有開啟,如果未開啟的話會提示將兩者設定 enable (murmur : 之前安裝時沒有這提示,實在太貼心拉!!)
Step 6 : 順利安裝完畢後,會跳出下列畫面並提示你登入你的 Docker 帳號資訊
Step 7 : 登入之後可以在螢幕右下角看到 Docker is running,代表 Docker for Windows 安裝成功,點擊 Docker 按右鍵可以看到 Docker 的資訊
Note 1 : 在 Step 3 中如果第二項預設已 Linux container 為主,在 Docker 按右鍵就可以看到選單中一項 switch to windows containers 可以針對 Windows / Linux 兩者進行切換動作
Note 2 : Step 5 步驟可以於安裝前先手動開啟設定 Container & Hyper-V,設定路徑為
控制台 > 開啟或關閉 Windows 功能 > Container & Hyper-V 兩者選項打勾 (若是啟動 Hyper-V有遇到問題可以參考 MSDN 在 Windows 10 上安裝 Hyper-V 文章)
Docker 指令
在 Docker 中有提供相當多的 command line 指令供開發者操作,詳細的 command line 說明與語法都可以在 官方文件 查詢到,在安裝完成 Docker 之後,可以執行查看版本與跑 Hello world 試試看是否正常
-   docker version  : docker version : 顯示 Docker 版本資訊
PS D:\> docker version
Client: Docker Engine - Community
 Version:           18.09.1
 API version:       1.39
 Go version:        go1.10.6
 Git commit:        4c52b90
 Built:             Wed Jan  9 19:34:26 2019
 OS/Arch:           windows/amd64
 Experimental:      false

Server: Docker Engine - Community
 Engine:
  Version:          18.09.1
  API version:      1.39 (minimum version 1.24)
  Go version:       go1.10.6
  Git commit:       4c52b90
  Built:            Wed Jan  9 19:50:10 2019
  OS/Arch:          windows/amd64
  Experimental:     false
-  docker run hello-world  Run a command in a new container
PS D:\> Docker run hello-world
Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
6a5e981230da: Pull complete
dc4b656f6979: Pull complete
2848c5402b33: Pull complete
9e0171b11ac8: Pull complete
Digest: sha256:2557e3c07ed1e38f26e389462d03ed943586f744621577a99efb77324b0fe535
Status: Downloaded newer image for hello-world:latest

Hello from Docker!
This message shows that your installation appears to be working correctly.

To generate this message, Docker took the following steps:
 1. The Docker client contacted the Docker daemon.
 2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
    (windows-amd64, nanoserver-1809)
 3. The Docker daemon created a new container from that image which runs the
    executable that produces the output you are currently reading.
 4. The Docker daemon streamed that output to the Docker client, which sent it
    to your terminal.

To try something more ambitious, you can run a Windows Server container with:
 PS C:\> docker run -it mcr.microsoft.com/windows/servercore powershell

Share images, automate workflows, and more with a free Docker ID:
 https://hub.docker.com/

For more examples and ideas, visit:
 https://docs.docker.com/get-started/
程式說明 : 
  • Line 2 : 發現 local 並沒有要執行的 hello-world image
  • Line 3-9 : 到 libary 把 hello-world image pull 下來進行下載的動作
  • Line 11 : 執行結果 hello from docker
感想
以上詳細介紹了 Docker for Windows 的安裝流程,也在最後簡單說明下 command line 下 hello world 感受一下 docker,但其實這都只是的冰山一角還有更多好用功能與指令,例如說管理 container、如何建立自己的 image 印象檔、使用 docker-compose 進行部署等,更可以顯示出 Docker 的強大之處,雖來介紹文晚了別人好幾步(年),日後有時間希望可以慢慢補齊 XDDD
參考
Docker
Docker Commandline
Docker 入门教程

2019年1月28日 星期一

[Docker] a Windows version 10.0.xxxxx-based image is incompatible with a 10.0.ooooo host

問題
今天在使用 docker image pull 上課要用的檔案時失敗,顯示訊息為 a Windows version 10.0.17763-based image is incompatible with a 10.0.17134 host ,用過 docker 許多次都未曾出現過此訊息覺得有點詭異,經確認後發現需要 pull 的 image windows 版本與筆電執行環境版本有所差異,因為會造成 pull 失敗,近期腦容量忘記事情的速度比學東西還快,特此紀錄獻給之後的自己
解決方案
確認 windows 版本
首先與上課老師確認需要 pull 的 image 為 1809 版,因此第一步是確認目前筆電的 windows 10 version為何,確認方式 : 左下角開始 > 搜尋 > 輸入 winver
接著會跳出關於 window,即可透過此視窗得知 windows 1803 版本
(這圖片是更新完才抓的,當下為 windows 10 version 1803 XDDD)
發現主要是因為版本不同造成 pull 失敗原因,因此下一步為將筆電 windows 10 升級到 windows 10 version 1809 版,但由於在 2018 第四季 Windows 10 version 1809 版有過小小的災害(後續已修復),因此透過筆電的 windows update 無法順利下載到最新版本

檢查更新
需要直接在網頁下載最新的 windows 10 update,讓要 pull 的 image 檔案版本達到一致的效果傳送門在此 : Windows 10 October 2018 Update 現正供應中,進入到網頁後按下 立即更新 按鈕,會下載windows upgrade
接著找到下載完畢的檔案 Windows10Upgrade9252.exe,在檔案上點擊兩下開始進行安裝作業
window update 安裝軟體會提醒你目前 version 和即將要升級的版本,然後瘋狂按下一步


安裝完畢後需要重新開機,進入 windows 前需要安裝 / 套用新的 windows update 設定

重新驗證
這邊再針對原本 pull 失敗的語法重新執行一次,發現更新完成後可進行 docker pull 的動作,大喜大賀

參考
windows10 download

2019年1月27日 星期日

[Docker] Error response from daemon: pull access denied for hello-world

問題
在 Window 10 上安裝完 Docker 後,照著官方文件提到透過 powershell 下 command line 確認安裝是否正常,第一項輸入 docker version 正常順利執行,但下一步 docker run hello-world 就沒那麼順利跳出無法正常執行,錯誤訊息如下所示
PS D:\> docker run hello-world
Unable to find image 'hello-world:latest' locally
C:\Program Files\Docker\Docker\Resources\bin\docker.exe: Error response from daemon: pull access denied for hello-world, repository does not exist or may require 'docker login'.
See 'C:\Program Files\Docker\Docker\Resources\bin\docker.exe run --help'.
PS D:\>
解決方案
解決方式很簡單,在第一次使用 docker run 之前需先做登入的動作(印象中之前不用登入),可以透過兩種方式在 Docker 登入
第一種 : 在 Docker icon 按下右鍵 > 選擇 sign in 
接著在 GUI 上輸入帳號密碼等資訊,即可正常執行
第二種 : 直接在 Powershell 上面打指令 docker login ,輸入 docker id & password 相關資訊,接著在重新執行一次官方文件的 hello-world 即可正常進行說明如下
PS C:\Users\marcustung> docker login
Login with your Docker ID to push and pull images from Docker Hub. If you dont have a Docker ID, head over to https://hub.docker.com to create one.
Username: marcustung
Password:
Login Succeeded
PS C:\Users\marcustung> docker run hello-world

Hello from Docker!
This message shows that your installation appears to be working correctly.

To generate this message, Docker took the following steps:
 1. The Docker client contacted the Docker daemon.
 2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
    (amd64)
 3. The Docker daemon created a new container from that image which runs the
    executable that produces the output you are currently reading.
 4. The Docker daemon streamed that output to the Docker client, which sent it
    to your terminal.

To try something more ambitious, you can run an Ubuntu container with:
 $ docker run -it ubuntu bash

Share images, automate workflows, and more with a free Docker ID:
 https://hub.docker.com/

For more examples and ideas, visit:
 https://docs.docker.com/get-started/
在3-5行可以看到輸入帳號密碼後顯示登入成功,接下來再使用 docker run hello-world 步驟即可看到 Hello from Docker! 可以開始享受 Docker 的強大之處了!!!

參考
Docker hello-world: authentication error

2019年1月26日 星期六

[.NET] 使用 MethodBase.GetCurrentMethod 取得執行方法資訊

前言 
在過去 method 發生例外用 catch 包起來時,往往 catch 寫的 logName 都是 hard Code 寫死 method Name,但常常會發生 copy 來 copy 去的時候忘記改寫死的 method name 造成 log 寫錯誤狀況發生,之前使用 C# 4.5 提供的 CallerMemberName attribute 解決此問題簡單範例如下
private void Test(string message, [CallerMemberName] string memberName = "")
{
    try
    {
        // do something
    }
    catch (Exception e)
    {
        Console.WriteLine($"Error Method : {memberName} , Message : {message}");
    }
}
但在 Method 都必須加上參數 CallerMember,此篇文章介紹另一種方式解決此問題

使用方式
在命名空間 System.Reflection 可以用 MethodBase 靜態方法取得當前方法的相關資訊,使用方式如下所示
MethodBase.GetCurrentMethod()
在 GetCurrencyMethod 方法還可以取得方法名稱、命名空間、全名等資訊
MethodBase.GetCurrentMethod().Name ;
MethodBase.GetCurrentMethod().DeclaringType.Namespace;
MethodBase.GetCurrentMethod().DeclaringType.FullName;
再回到今天想解決的問題,在發生例外使用用 Methodbase 取代 CallerMember 取得當下執行的方法,即可不用在 hardCode 在例外的訊息中,不用擔心 copy 到其他地方要再修改的問題,使用前須先using system.reflection 命名空間範例 Code 如下
using System.Reflection;

static void Main(string[] args)
{
    // 目前執行方法的類別名稱
    Console.WriteLine($"GetCurrentMethod.Name : {MethodBase.GetCurrentMethod().Name}");
    // 目前執行方法的命名空間
    Console.WriteLine($"GetCurrentMethod.DeclaringType.Namespace : {MethodBase.GetCurrentMethod().DeclaringType.Namespace}");
    // 目前執行方法的全名
    Console.WriteLine($"GetCurrentMethod.DeclaringType.FullName : {MethodBase.GetCurrentMethod().DeclaringType.FullName}");

    try
    {
        CallForException();
    }
    catch (Exception e)
    {
        Console.WriteLine("Exception Method Name : {0} ", GetException(MethodBase.GetCurrentMethod(), e));
    }

    Console.ReadKey();
}

private static string GetException(MethodBase methodBase, Exception e)
{
    StackTrace trace = new StackTrace(e);
    StackFrame previousFrame = null;

    foreach (StackFrame frame in trace.GetFrames())
    {
        if (frame.GetMethod() == methodBase)
        {
            break;
        }

        previousFrame = frame;
    }

    return previousFrame?.GetMethod().Name;
}

private static void CallForException()
{
    DoActualException();
}

private static void DoActualException()
{
    throw new NotImplementedException();
}
輸出
上面 sample Code 輸出如下
  • 執行的 method Name 為 main
  • 執行的 method Name 命名空間為 consoleApp1 
  • 發生例外 try catch 裡的方法名稱為 CallForException
輕鬆上手,打完收工 !!

參考
MethodBase.GetCurrentMethod Method

2019年1月25日 星期五

[VS2017] 提升 Resharper 在 Visual Studio IDE 執行速度

前言 
Visual Studio 是地表上最強的開發工具,最近發現在安裝完 Resharper 後開啟專案時都會遇到
載入專案的速度變慢的問題Visual Studio 會在上方提示 JetBrains ReSharper Ultimate’ likely caused 8 seconds of unresponsiveness. Disabling it may improve your experience.的訊息,甚至有些開發筆電規格比較差載入時間會更久,經過主管的提點告知 Resharper 提供 Resharper Performance Guide 方面的設定讓開發者可以針對緩慢的項目進行調整來改善載入緩慢問題,這篇簡單介紹如何設定


使用方式
進入點
要開啟 Resharper Performance Guide 可以透過以下兩種方式
方式 1 : 工具列 > Resharper > Options > Evnironment > Performance Guide
方式 2 : 在 Visual Studio IDE 右下角 > Notification 通知 > Configure settings to improve performance
設定介紹
分為兩大項 Visual Studio perferences affecting performacne 與 Resharper perferences affecting performacne,分別可以針對其細項內容設定,每個選項都有一個設定值可以讓開發者希望如何執行,每個值有提供三個選項供選擇
  • Ignore : 在 Visual Studio 加載時候忽略此選項
  • Show in Status barVisual Studio 加載完專案後,會在右下角提示提示開發者此設定可以有更好的選項可以提高速度
  • Fix Silently : 允許 Resharper 在 Visual Studio 啟動與載入專案時自動調整性能調整設定,不用通知開發者或在右下角狀態列告知

建議設定
在 Resharper 官方 blog 建議如果沒有在使用下述功能情況下可以關閉選項,有助於提升回應時間
  • Disable XAML designer
  • Enable CodeLens
詳細可以參考 Resharper 部落格 說明原因另外在搜尋資料過程中發現一篇文章 : 提升ReSharper和Visual Studio的性能裡面有說明部分選項設定的來龍去脈,讓開發者在設定時可以獲得更多資訊
謝謝

參考
Performance Guide for Visual Studio

Copyright © m@rcus 學習筆記 | Powered by Blogger

Design by Anders Noren | Blogger Theme by NewBloggerThemes.com