久久精品人人爽,华人av在线,亚洲性视频网站,欧美专区一二三

Docker鏡像的逆向工程怎么實現(xiàn)

169次閱讀
沒有評論

共計 7885 個字符,預(yù)計需要花費 20 分鐘才能閱讀完成。

這篇文章主要講解了“Docker 鏡像的逆向工程怎么實現(xiàn)”,文中的講解內(nèi)容簡單清晰,易于學(xué)習(xí)與理解,下面請大家跟著丸趣 TV 小編的思路慢慢深入,一起來研究和學(xué)習(xí)“Docker 鏡像的逆向工程怎么實現(xiàn)”吧!

首先,讓 Docker  守護(hù)進(jìn)程 daemon 拉取鏡像,然后將鏡像提取到文件中:

docker pull tmknom/prettier:2.0.5docker save tmknom/prettier:2.0.5   prettier.tar

是的,該文件只是一個典型 tarball 格式的歸檔文件:

$ tar xvf prettier.tar6c37da2ee7de579a0bf5495df32ba3e7807b0a42e2a02779206d165f55f1ba70/6c37da2ee7de579a0bf5495df32ba3e7807b0a42e2a02779206d165f55f1ba70/VERSION6c37da2ee7de579a0bf5495df32ba3e7807b0a42e2a02779206d165f55f1ba70/json6c37da2ee7de579a0bf5495df32ba3e7807b0a42e2a02779206d165f55f1ba70/layer.tar88f38be28f05f38dba94ce0c1328ebe2b963b65848ab96594f8172a9c3b0f25b.jsona9cc4ace48cd792ef888ade20810f82f6c24aaf2436f30337a2a712cd054dc97/a9cc4ace48cd792ef888ade20810f82f6c24aaf2436f30337a2a712cd054dc97/VERSIONa9cc4ace48cd792ef888ade20810f82f6c24aaf2436f30337a2a712cd054dc97/jsona9cc4ace48cd792ef888ade20810f82f6c24aaf2436f30337a2a712cd054dc97/layer.tard4f612de5397f1fc91272cfbad245b89eac8fa4ad9f0fc10a40ffbb54a356cb4/d4f612de5397f1fc91272cfbad245b89eac8fa4ad9f0fc10a40ffbb54a356cb4/VERSIONd4f612de5397f1fc91272cfbad245b89eac8fa4ad9f0fc10a40ffbb54a356cb4/jsond4f612de5397f1fc91272cfbad245b89eac8fa4ad9f0fc10a40ffbb54a356cb4/layer.tarmanifest.jsonrepositories

如你所見,Docker 在命名時經(jīng)常使用哈希 hash。我們看看  manifest.json。它是以難以閱讀的壓縮 JSON 寫的,不過  JSON 瑞士軍刀 jq  可以很好地打印 JSON:

$ jq . manifest.json[ {  Config :  88f38be28f05f38dba94ce0c1328ebe2b963b65848ab96594f8172a9c3b0f25b.json ,  RepoTags : [  tmknom/prettier:2.0.5  ],  Layers : [  a9cc4ace48cd792ef888ade20810f82f6c24aaf2436f30337a2a712cd054dc97/layer.tar ,  d4f612de5397f1fc91272cfbad245b89eac8fa4ad9f0fc10a40ffbb54a356cb4/layer.tar ,  6c37da2ee7de579a0bf5495df32ba3e7807b0a42e2a02779206d165f55f1ba70/layer.tar  ] }]

請注意,這三個層 Layer 對應(yīng)三個以哈希命名的目錄。我們以后再看。現(xiàn)在,讓我們看看  Config  鍵指向的 JSON 文件。它有點長,所以我只在這里轉(zhuǎn)儲第一部分:

$ jq . 88f38be28f05f38dba94ce0c1328ebe2b963b65848ab96594f8172a9c3b0f25b.json | head -n 20{  architecture :  amd64 ,  config : {  Hostname :  ,  Domainname :  ,  User :  ,  AttachStdin : false,  AttachStdout : false,  AttachStderr : false,  Tty : false,  OpenStdin : false,  StdinOnce : false,  Env : [  PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin  ],  Cmd : [  --help  ],  ArgsEscaped : true,  Image :  sha256:93e72874b338c1e0734025e1d8ebe259d4f16265dc2840f88c4c754e1c01ba0a ,

最重要的是  history  列表,它列出了鏡像中的每一層。Docker 鏡像由這些層堆疊而成。Dockerfile 中幾乎每條命令都會變成一個層,描述該命令對鏡像所做的更改。如果你執(zhí)行  RUN script.sh  命令創(chuàng)建了  really_big_file,然后用  RUN rm really_big_file  命令刪除文件,Docker 鏡像實際生成兩層:一個包含  really_big_file,一個包含  .wh.really_big_file  記錄來刪除它。整個鏡像文件大小不變。這就是為什么你會經(jīng)??吹较? RUN script.sh rm really_big_file  這樣的 Dockerfile 命令鏈接在一起 mdash; mdash; 它保障所有更改都合并到一層中。

以下是該 Docker 鏡像中記錄的所有層。注意,大多數(shù)層不改變文件系統(tǒng)鏡像,并且  empty_layer  標(biāo)記為  true。以下只有三個層是非空的,與我們之前描述的相符。

$ jq .history 88f38be28f05f38dba94ce0c1328ebe2b963b65848ab96594f8172a9c3b0f25b.json[ {  created :  2020-04-24T01:05:03.608058404Z ,  created_by :  /bin/sh -c #(nop) ADD file:b91adb67b670d3a6ff9463e48b7def903ed516be66fc4282d22c53e41512be49 in /   }, {  created :  2020-04-24T01:05:03.92860976Z ,  created_by :  /bin/sh -c #(nop) CMD [\ /bin/sh\] ,  empty_layer : true }, {  created :  2020-04-29T06:34:06.617130538Z ,  created_by :  /bin/sh -c #(nop) ARG BUILD_DATE ,  empty_layer : true }, {  created :  2020-04-29T06:34:07.020521808Z ,  created_by :  /bin/sh -c #(nop) ARG VCS_REF ,  empty_layer : true }, {  created :  2020-04-29T06:34:07.36915054Z ,  created_by :  /bin/sh -c #(nop) ARG VERSION ,  empty_layer : true }, {  created :  2020-04-29T06:34:07.708820086Z ,  created_by :  /bin/sh -c #(nop) ARG REPO_NAME ,  empty_layer : true }, {  created :  2020-04-29T06:34:08.06429638Z ,  created_by :  /bin/sh -c #(nop) LABEL org.label-schema.vendor=tmknom org.label-schema.name=tmknom/prettier org.label-schema.description=Prettier is an opinionated code formatter. org.label-schema.build-date=2020-04-29T06:34:01Z org.label-schema.version=2.0.5 org.label-schema.vcs-ref=35d2587 org.label-schema.vcs-url=https://github.com/tmknom/prettier org.label-schema.usage=https://github.com/tmknom/prettier/blob/master/README.md#usage org.label-schema.docker.cmd=docker run --rm -v $PWD:/work tmknom/prettier --parser=markdown --write  **/*.md  org.label-schema.schema-version=1.0 ,  empty_layer : true }, {  created :  2020-04-29T06:34:08.511269907Z ,  created_by :  /bin/sh -c #(nop) ARG NODEJS_VERSION=12.15.0-r1 ,  empty_layer : true }, {  created :  2020-04-29T06:34:08.775876657Z ,  created_by :  /bin/sh -c #(nop) ARG PRETTIER_VERSION ,  empty_layer : true }, {  created :  2020-04-29T06:34:26.399622951Z ,  created_by :  |6 BUILD_DATE=2020-04-29T06:34:01Z NODEJS_VERSION=12.15.0-r1 PRETTIER_VERSION=2.0.5 REPO_NAME=tmknom/prettier VCS_REF=35d2587 VERSION=2.0.5 /bin/sh -c set -x   apk add --no-cache nodejs=${NODEJS_VERSION} nodejs-npm=${NODEJS_VERSION}   npm install -g prettier@${PRETTIER_VERSION}   npm cache clean --force   apk del nodejs-npm  }, {  created :  2020-04-29T06:34:26.764034848Z ,  created_by :  /bin/sh -c #(nop) WORKDIR /work  }, {  created :  2020-04-29T06:34:27.092671047Z ,  created_by :  /bin/sh -c #(nop) ENTRYPOINT [\ /usr/bin/prettier\] ,  empty_layer : true }, {  created :  2020-04-29T06:34:27.406606712Z ,  created_by :  /bin/sh -c #(nop) CMD [\ --help\] ,  empty_layer : true }]

太棒了!所有的命令都在  created_by  字段中,我們幾乎可以用這些命令重建 Dockerfile。但不是完全可以。最上面的  ADD  命令實際上沒有給我們需要添加的文件。COPY  命令也沒有全部信息。我們還失去了  FROM  語句,因為它們擴(kuò)展成了從基礎(chǔ) Docker 鏡像繼承的所有層。

我們可以通過查看時間戳 timestamp,按 Dockerfile 對層進(jìn)行分組。大多數(shù)層的時間戳相差不到一分鐘,代表每一層構(gòu)建所需的時間。但是前兩層是  2020-04-24,其余的是  2020-04-29。這是因為前兩層來自一個基礎(chǔ) Docker 鏡像。理想情況下,我們可以找出一個  FROM  命令來獲得這個鏡像,這樣我們就有了一個可維護(hù)的 Dockerfile。

manifest.json  展示第一個非空層是  a9cc4ace48cd792ef888ade20810f82f6c24aaf2436f30337a2a712cd054dc97/layer.tar。讓我們看看它:

$ cd a9cc4ace48cd792ef888ade20810f82f6c24aaf2436f30337a2a712cd054dc97/$ tar tf layer.tf | headbin/bin/archbin/ashbin/base64bin/bbconfigbin/busyboxbin/catbin/chgrpbin/chmodbin/chown

看起來它可能是一個操作系統(tǒng) operating system 基礎(chǔ)鏡像,這也是你期望從典型 Dockerfile 中看到的。Tarball 中有 488 個條目,如果你瀏覽一下,就會發(fā)現(xiàn)一些有趣的條目:

...dev/etc/etc/alpine-releaseetc/apk/etc/apk/archetc/apk/keys/etc/apk/keys/alpine-devel@lists.alpinelinux.org-4a6a0840.rsa.pubetc/apk/keys/alpine-devel@lists.alpinelinux.org-5243ef4b.rsa.pubetc/apk/keys/alpine-devel@lists.alpinelinux.org-5261cecb.rsa.pubetc/apk/protected_paths.d/etc/apk/repositoriesetc/apk/worldetc/conf.d/...

果不其然,這是一個  Alpine  鏡像,如果你注意到其他層使用  apk  命令安裝軟件包,你可能已經(jīng)猜到了。讓我們解壓 tarball 看看:

$ mkdir files$ cd files$ tar xf ../layer.tar$ lsbin dev etc home lib media mnt opt proc root run sbin srv sys tmp usr var$ cat etc/alpine-release3.11.6

如果你拉取、解壓  alpine:3.11.6,你會發(fā)現(xiàn)里面有一個非空層,layer.tar  與 Prettier 鏡像基礎(chǔ)層中的  layer.tar  是一樣的。

出于興趣,另外兩個非空層是什么?第二層是包含 Prettier 安裝包的主層。它有 528 個條目,包含 Prettier、一堆依賴項和證書更新:

...usr/lib/libuv.so.1usr/lib/libuv.so.1.0.0usr/lib/node_modules/usr/lib/node_modules/prettier/usr/lib/node_modules/prettier/LICENSEusr/lib/node_modules/prettier/README.mdusr/lib/node_modules/prettier/bin-prettier.jsusr/lib/node_modules/prettier/doc.jsusr/lib/node_modules/prettier/index.jsusr/lib/node_modules/prettier/package.jsonusr/lib/node_modules/prettier/parser-angular.jsusr/lib/node_modules/prettier/parser-babel.jsusr/lib/node_modules/prettier/parser-flow.jsusr/lib/node_modules/prettier/parser-glimmer.jsusr/lib/node_modules/prettier/parser-graphql.jsusr/lib/node_modules/prettier/parser-html.jsusr/lib/node_modules/prettier/parser-markdown.jsusr/lib/node_modules/prettier/parser-postcss.jsusr/lib/node_modules/prettier/parser-typescript.jsusr/lib/node_modules/prettier/parser-yaml.jsusr/lib/node_modules/prettier/standalone.jsusr/lib/node_modules/prettier/third-party.jsusr/local/usr/local/share/usr/local/share/ca-certificates/usr/sbin/usr/sbin/update-ca-certificatesusr/share/usr/share/ca-certificates/usr/share/ca-certificates/mozilla/usr/share/ca-certificates/mozilla/ACCVRAIZ1.crtusr/share/ca-certificates/mozilla/AC_RAIZ_FNMT-RCM.crtusr/share/ca-certificates/mozilla/Actalis_Authentication_Root_CA.crt...

第三層由  WORKDIR /work  命令創(chuàng)建,它只包含一個條目:

$ tar tf 6c37da2ee7de579a0bf5495df32ba3e7807b0a42e2a02779206d165f55f1ba70/layer.tarwork/

原始 Dockerfile 在 Prettier 的 git 倉庫中。

感謝各位的閱讀,以上就是“Docker 鏡像的逆向工程怎么實現(xiàn)”的內(nèi)容了,經(jīng)過本文的學(xué)習(xí)后,相信大家對 Docker 鏡像的逆向工程怎么實現(xiàn)這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是丸趣 TV,丸趣 TV 小編將為大家推送更多相關(guān)知識點的文章,歡迎關(guān)注!

正文完
 
丸趣
版權(quán)聲明:本站原創(chuàng)文章,由 丸趣 2023-08-17發(fā)表,共計7885字。
轉(zhuǎn)載說明:除特殊說明外本站除技術(shù)相關(guān)以外文章皆由網(wǎng)絡(luò)搜集發(fā)布,轉(zhuǎn)載請注明出處。
評論(沒有評論)
主站蜘蛛池模板: 石门县| 清远市| 阿拉尔市| 合阳县| 招远市| 凌云县| 安远县| 阆中市| 九龙城区| 宜川县| 河池市| 喀喇沁旗| 阿勒泰市| 和平区| 中牟县| 朝阳区| 湛江市| 阿城市| 汕头市| 平山县| 沈丘县| 富民县| 杭州市| 百色市| 和田市| 五原县| 定陶县| 宜都市| 平果县| 万源市| 垫江县| 阿合奇县| 永嘉县| 固安县| 石柱| 嘉黎县| 内江市| 德清县| 石河子市| 渑池县| 高雄市|