兩個 Docker 使用神技,99% 的人都不知道!
最近發現兩個非常好用的工具,一個是 runlike,一個是 whaler
- runlike:通過容器打印出容器的啟動命令
- whaler:通過鏡像導出dockerfile
聽起來是不是想說 N...B... 哈哈,那就走起?
1.找回 Docker 容器運行的命令
平時可能因為測試或者一些規范的操作方式導致啟動一個容器,忘記了這個容器的啟動命令是什么了,又需要找回來在別的機器上創建的時候,就很麻煩,可能很多人會想到通過 docker inspect 分析輸出的 json 文件中的volume、ports、Env等
- $ docker inspect $container_name
這個命令應該是很熟悉的,查看容器的基本信息。
雖然這樣也能找到運行容器的命令,但是依舊還需要時間去整理,因此這里分享一個可以直接打印運行命令的工具runlike[1],在runlike傳遞一個容器名稱,就會直接打印出該容器的運行命令。runlike使用起來非常方便,可以直接通過pip安裝,也可以通過容器方式免安裝使用:
- # pip
- $ pip install runlike
- # by docker
- $ alias runlike="docker run --rm -v /var/run/docker.sock:/var/run/docker.sock assaflavie/runlike"
下面還是通過上面那個容器測試一下是否可以:
這樣使用起來就方便很多了。關于 runlike 一些其他的選項,可以直接通過--help學習。
2.從鏡像導出Dockerfile
平時可能會構建很多不同的鏡像,比如維護一些基礎Docker鏡像、想查看一些公開倉庫的Docker鏡像是怎么構建的,或因為長時間不維護找不到當時構建鏡像的 Dockerfile,或者因為網絡無法查看時,能從鏡像導出Dockerfile就顯得很重要,這里可以通過 whaler[2] 來快速的導出. 這里我們依舊不安裝,通過容器化的方式使用dfimage命令,便于使用,我們將該命令寫成命令別名:
- # alias export docker image to dockerfile
- $ alias whaler="docker run -t --rm -v /var/run/docker.sock:/var/run/docker.sock:ro pegleg/whaler"
然后通過whaler命令輸出 pegleg/whaler 鏡像的dockerfile文件:
這樣就輸出pegleg/whaler這個鏡像的 Dockerfile 大致的內容了,還是彩色的輸出呢?哈哈,有心了。從上圖可以看到輸出的 Dockerfile 也與平常寫的不太一樣,可以在 Github 上看下倉庫內的 Dockerfile 文件
- FROM golang:1.14.4 AS builder
- WORKDIR $GOPATH
- RUN go get -u github.com/P3GLEG/Whaler
- WORKDIR $GOPATH/src/github.com/P3GLEG/Whaler
- RUN export CGO_ENABLED=0 && go build .
- RUN cp Whaler /root/Whaler
- FROM alpine:3.12.0
- WORKDIR /root/
- COPY --from=builder /root/Whaler .
- ENTRYPOINT ["./Whaler"]
由 Dockerfile 來看,這個 whaler 采用的多階段構建,所以無法輸出 --from=builder 的構建內容,這個鍋 whaler 不背,我們可以換一個鏡像看看:
這個就顯示的很自然,很有熟悉的味道了。whaler 支持同時分析多個鏡像等等功能,這里就不在說了,感興趣的可以自己看一下。至于 whaler 是怎么實現的,其實看一下源碼就明白了。