新聞中心
?背景
新上線(xiàn)一個(gè)批處理功能,基于Docker發(fā)布的。上線(xiàn)之后出現(xiàn)一個(gè)問(wèn)題,Docker批處理生成的文件目錄,別的應(yīng)用程序無(wú)法訪(fǎng)問(wèn)。

之前也在使用Docker,但并未涉及到文件共享的問(wèn)題,還真沒(méi)留意到。經(jīng)過(guò)一系列排查,終于找到原因。這篇文章就記錄一下排查過(guò)程中使用到的技術(shù)點(diǎn),也幫大家重溫一下。
涉及的知識(shí)點(diǎn):Docker help命令、Linux用戶(hù)/組id查看、Docker用戶(hù)指定、Docker啟動(dòng)失敗日志查看等
現(xiàn)象分析
Docker運(yùn)行的項(xiàng)目定時(shí)創(chuàng)建文件目錄并進(jìn)行文件生成等操作,但當(dāng)其他應(yīng)用程序來(lái)操作Docker應(yīng)用生成的目錄時(shí),會(huì)提示“Permission denied”錯(cuò)誤。
查看Docker生成的文件夾權(quán)限,竟然是以root用戶(hù)創(chuàng)建的。執(zhí)行Docker的啟動(dòng)腳本明明是普通用戶(hù),生成的文件怎么就變成了root用戶(hù)了?
這里就涉及到通過(guò)Docker執(zhí)行執(zhí)行時(shí)所使用的用戶(hù)了。如果在執(zhí)行Docker執(zhí)行命令時(shí),未指定所使用的用戶(hù),默認(rèn)以root用戶(hù)執(zhí)行。在這生產(chǎn)環(huán)境下當(dāng)然是不允許的了。
問(wèn)題解決
既然找到問(wèn)題的原因解決起來(lái)就比較容易了,下面記錄一下解決問(wèn)題及涉及到的一些Docker命令和Linux操作。
查詢(xún)幫助文檔
先來(lái)通過(guò)help命令查看一下Docker的命令參數(shù),如何來(lái)指定執(zhí)行命令的用戶(hù)。
先嘗試了docker --help命令,結(jié)果并未找到指定用戶(hù)的命令參數(shù):
$ sudo docker --help
Usage: docker [OPTIONS] COMMAND
A self-sufficient runtime for containers
Options:
--config string Location of client config files (default "/root/.docker")
-c, --context string Name of the context to use to connect to the daemon (overrides DOCKER_HOST env var and default context set with "docker context use")
-D, --debug Enable debug mode
-H, --host list Daemon socket(s) to connect to
-l, --log-level string Set the logging level ("debug"|"info"|"warn"|"error"|"fatal") (default "info")
--tls Use TLS; implied by --tlsverify
--tlscacert string Trust certs signed only by this CA (default "/root/.docker/ca.pem")
--tlscert string Path to TLS certificate file (default "/root/.docker/cert.pem")
--tlskey string Path to TLS key file (default "/root/.docker/key.pem")
--tlsverify Use TLS and verify the remote
-v, --version Print version information and quit
后來(lái)才意識(shí)到,查找的應(yīng)該是docker的run命令的幫助文檔:
$ sudo docker run --help
...
-u, --user string Username or UID (format:[: ])
--userns string User namespace to use
--uts string UTS namespace to use
...
其中便有指定run命令操作的所屬用戶(hù)參數(shù),通過(guò)-u可指定執(zhí)行命令的用戶(hù)和組。
docker指定用戶(hù)
參照幫助手冊(cè),整理了docker的運(yùn)行命令(偽代碼):
$ sudo docker run -itd -u testuser -p 8080:8080 -v /log/:/log xxx-job:latest
上述指令中通過(guò)-u username指定了執(zhí)行命令的用戶(hù),按理說(shuō)可以正常執(zhí)行的,但執(zhí)行時(shí)拋出了以下異常信息:
docker: Error response from daemon: unable to find user testuser: no matching entries in passwd file.'
雖然當(dāng)前用戶(hù)是testuser,但docker貌似并未在passwd文件中找到它,此時(shí)直接通過(guò)用戶(hù)的UID來(lái)替換Username。
獲得Linux用戶(hù)UID
獲得Linux用戶(hù)的UID有兩種方法。
方法一:執(zhí)行命令。
獲得UID命令:
$ id -u
1002
當(dāng)前用戶(hù)的UID便是1002。
獲得組ID命令:
$ id -g
1002
當(dāng)前用戶(hù)所屬組ID便是1002。
方法二:查看/etc/passwd獲取UID和組ID。
執(zhí)行cat /etc/passwd命令,顯示/etc/passwd中的內(nèi)容。
圖片來(lái)源于網(wǎng)絡(luò)
在/etc/passwd中找到當(dāng)前用戶(hù)后面對(duì)應(yīng)的UID和組ID。
調(diào)整Docker命令
獲得了當(dāng)前用戶(hù)的UID和組ID之后,Docker運(yùn)行命令修改如下:
$ sudo docker run -itd -u 1002:1002 -p 8080:8080 -v /log/:/log xxx-job:latest
正常來(lái)說(shuō),問(wèn)題到此便解決了,可正常啟動(dòng)應(yīng)用程序。
Docker日志查看
但筆者又遇到另外一個(gè)問(wèn)題,就是Docker中應(yīng)用的日志,由于之前的失誤默認(rèn)通過(guò)root用戶(hù)創(chuàng)建的,此時(shí)使用了testuser來(lái)啟動(dòng)應(yīng)用程序,發(fā)現(xiàn)Docker無(wú)法啟動(dòng),原因很簡(jiǎn)單testuser啟動(dòng)的應(yīng)用無(wú)法向root創(chuàng)建的日志文件寫(xiě)日志。
排查啟動(dòng)失敗時(shí)用到了查看Docker失敗日志的命令:
docker logs 97069f94437b
此時(shí),或?qū)⒃瓉?lái)的日志備份,讓系統(tǒng)重新生成日志文件,或直接修改日志文件權(quán)限為testuser即可。
至此,關(guān)于Docker生成目錄權(quán)限問(wèn)題解決完畢。
小結(jié)
其實(shí),導(dǎo)致上面問(wèn)題的原因很小,就是漏了一個(gè)參數(shù)的事。但不經(jīng)一事,不長(zhǎng)一智??赡芎芏嗯笥言谑褂肈ocker的過(guò)程中可能都沒(méi)留意到這一問(wèn)題。
而問(wèn)題的排查過(guò)程也很有意思,不僅涉及到了Docker的操作命令,也涉及到了Linux的一些基礎(chǔ)知識(shí),知識(shí)和技能就是在出現(xiàn)問(wèn)題、解決問(wèn)題的過(guò)程中增長(zhǎng)的。
文章題目:Docker踩坑,又漲知識(shí)了
文章路徑:http://fisionsoft.com.cn/article/djhpccc.html


咨詢(xún)
建站咨詢(xún)
