# 自己動手寫 docker - 除錯手冊
這個地方是紀錄閱讀書本 自己動手寫 docker 跟實作的過程中,因為版本不同出現的問題或除錯的結果
github Repo https://github.com/fwfly/toy_docker
### p17 : User Namespace 錯誤
```
就算跑 sudo 指令,也會出現 permission error
fork/exec /usr/bin/sh: operation not permitted
```
答案:
kernel 版本不相容,網路上有提供相關解法
solution :
https://github.com/xianlubird/mydocker/issues/3
簡單來說可以直接使用 syscall.CLONE_NEWUSER 然後不設定 gid 跟 uid, 系統會默認為 65535(nouser).
如過要設定 gid 跟 uid 則需要用 UidMappings 跟 GidMappings, SysProcAttr.Credential 在很多版本會出現 error.
### p24: WARNING: Your kernel does not support swap limit
Solution :
https://github.com/moby/moby/issues/4250
好用 config check script
https://github.com/moby/moby/blob/master/contrib/check-config.sh
### p27
在 docker 19版後, union file system 是使用 overlayFS (https://en.wikipedia.org/wiki/OverlayFS)
資料夾則是在 /var/snap/docker/common/var-lib-docker/overlay2
透過 ` docker inspect <image ID>` 可以找到相對應的資料夾
```
....
"GraphDriver": {
"Data": {
"LowerDir": "/var/snap/docker/common/var-lib-docker/overlay2/2c09b65166b1fe7cd8df52f731d0c3eec010246ad1314f3b38f7eebfebd4aa64/diff:/var/snap/docker/common/var-lib-docker/overlay2/c3ac3a50e11956be0542cac1d311b26ab176dc11c36809b7727de7091714a54e/diff:/var/snap/docker/common/var-lib-docker/overlay2/5447f70fad76a2bb0b5afe9b6dfa01bda5ac6bed5b5606d0fe6e93a329e3372c/diff",
"MergedDir": "/var/snap/docker/common/var-lib-docker/overlay2/98137f18bf2bc2b28b06d6444d5a766dc8f1c5e59d3e8b3dcf94b2af37a3dcb2/merged",
"UpperDir": "/var/snap/docker/common/var-lib-docker/overlay2/98137f18bf2bc2b28b06d6444d5a766dc8f1c5e59d3e8b3dcf94b2af37a3dcb2/diff",
"WorkDir": "/var/snap/docker/common/var-lib-docker/overlay2/98137f18bf2bc2b28b06d6444d5a766dc8f1c5e59d3e8b3dcf94b2af37a3dcb2/work"
},
"Name": "overlay2"
},
"RootFS": {
"Type": "layers",
"Layers": [
"sha256:2ce3c188c38d7ad46d2df5e6af7e7aed846bc3321bdd89706d5262fefd6a3390",
"sha256:ad44aa179b334bbf4aeb61ecef978c3c77a3bb27cb28bcb727f5566d7f085b31",
"sha256:35a91a75d24be7ff9c68ce618dcc933f89fef502a59becac8510dbc3bf7a4a05",
"sha256:a4399aeb9a0e1ddf9da712ef222fd66f707a8c7205ed2607c9c8aac0dbabe882"
]
},
```
### p40 ( Ch3.1.2 )
預設是缺少 package 的,所以需要先動手安裝
```
# 可能需要有 sudo access right
go get github.com/Sirupsen/logrus
go get github.com/urfave/cli
go get github.com/cpuguy83/go-md2man
```
### p41
在新版本的 cli.Command 的使用方式已經做改變,改成
```
app.Commands = []*cli.Command{
&initCommand,
&runCommand,
}
```
細節可以參考這邊
https://github.com/urfave/cli/blob/master/docs/v2/manual.md
在 Arg 長度也不是使用 len(),而是改成 NArg
```
context.NArg() < 1
```
https://github.com/urfave/cli/blob/master/context.go#L115