在Windows上使用download-frozen-image-v2.sh进行Docker镜像下载

时间:2018-06-22 17:04:31

标签: bash docker jq

我正在努力在未安装(也不能安装)Docker的连接互联网的Windows机器上下载Docker映像,以转移到安装了Docker的未连接互联网的Linux机器。我正在使用git-bash运行download-frozen-image-v2.sh。一切正常,直到脚本开始下载任何给定图像的最后一层。在最后一层,json文件被返回为空。通过echo语句,我可以看到一切正常,直到第119-142行

jq "$addJson + ." > "$dir/$layerId/json" <<-'EOJSON'
                {
                    "created": "0001-01-01T00:00:00Z",
                    "container_config": {
                        "Hostname": "",
                        "Domainname": "",
                        "User": "",
                        "AttachStdin": false,
                        "AttachStdout": false,
                        "AttachStderr": false,
                        "Tty": false,
                        "OpenStdin": false,
                        "StdinOnce": false,
                        "Env": null,
                        "Cmd": null,
                        "Image": "",
                        "Volumes": null,
                        "WorkingDir": "",
                        "Entrypoint": null,
                        "OnBuild": null,
                        "Labels": null
                    }
                }
            EOJSON

仅在最后一层,此代码会生成一个空的json文件,从而在第173行

中产生一个错误

jq --raw-output "$imageOldConfig + del(.history, .rootfs)" "$dir/$configFile" > "$dir/$imageId/json"

jq: error: syntax error, unexpected '+', expecting $end (Windows cmd shell quoting issues?) at <top-level>, line 1:
 + del(.history, .rootfs)
jq: 1 compile error

更新


确切的复制步骤

在Windows 10计算机上执行。

1)为Windows https://scoop.sh/

安装瓢

2)在Powershell中 scoop install git curl jq go tar

3)git-bash

4)在git-bash中 curl -o download-frozen-image-v2.sh https://raw.githubusercontent.com/moby/moby/master/contrib/download-frozen-image-v2.sh

5)bash download-frozen-image-vs.sh ubuntu ubuntu:latest

以上将导致上述错误。


响应下面的@peak

我正在使用的命令是bash download-frozen-image-v2.sh ubuntu ubuntu:latest,该命令应下载5层。前4个下载无可挑剔,只有最后一层失败。我对其他几张图像尝试了此过程,但在最后一层总是失败。

addJson:

{ id: "ee6b1042efee4fb07d2fe1a5079ce498567e6f5ac849413f0e623d4582da5bc9", parent: "80a2fb00dfe137a28c24fbc39fde656650cd68028d612e6f33912902d887b108" }

dir / configFile:

ubuntu/113a43faa1382a7404681f1b9af2f0d70b182c569aab71db497e33fa59ed87e6.json

dir / config文件内容:

{
"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": [
      "/bin/bash"
    ],
    "ArgsEscaped": true,
    "Image": "sha256:c2775c69594daa3ee360d8e7bbca93c65d9c925e89bd731f12515f9bf8382164",
    "Volumes": null,
    "WorkingDir": "",
    "Entrypoint": null,
    "OnBuild": null,
    "Labels": null
  },
  "container": "6713e927cc43b61a4ce3950a69907336ff55047bae9393256e32613a54321c70",
  "container_config": {
    "Hostname": "6713e927cc43",
    "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": [
      "/bin/sh",
      "-c",
      "#(nop) ",
      "CMD [\"/bin/bash\"]"
    ],
    "ArgsEscaped": true,
    "Image": "sha256:c2775c69594daa3ee360d8e7bbca93c65d9c925e89bd731f12515f9bf8382164",
    "Volumes": null,
    "WorkingDir": "",
    "Entrypoint": null,
    "OnBuild": null,
    "Labels": {}
  },
  "created": "2018-06-05T21:20:54.310450149Z",
  "docker_version": "17.06.2-ce",
  "history": [
    {
      "created": "2018-06-05T21:20:51.286433694Z",
      "created_by": "/bin/sh -c #(nop) ADD file:28c0771e44ff530dba3f237024acc38e8ec9293d60f0e44c8c78536c12f13a0b in / "
    },
    {
      "created": "2018-06-05T21:20:52.045074543Z",
      "created_by": "/bin/sh -c set -xe \t\t&& echo '#!/bin/sh' > /usr/sbin/policy-rc.d \t&& echo 'exit 101' >> /usr/sbin/policy-rc.d \t&& chmod +x /usr/sbin/policy-rc.d \t\t&& dpkg-divert --local --rename --add /sbin/initctl \t&& cp -a /usr/sbin/policy-rc.d /sbin/initctl \t&& sed -i 's/^exit.*/exit 0/' /sbin/initctl \t\t&& echo 'force-unsafe-io' > /etc/dpkg/dpkg.cfg.d/docker-apt-speedup \t\t&& echo 'DPkg::Post-Invoke { \"rm -f /var/cache/apt/archives/*.deb /var/cache/apt/archives/partial/*.deb /var/cache/apt/*.bin || true\"; };' > /etc/apt/apt.conf.d/docker-clean \t&& echo 'APT::Update::Post-Invoke { \"rm -f /var/cache/apt/archives/*.deb /var/cache/apt/archives/partial/*.deb /var/cache/apt/*.bin || true\"; };' >> /etc/apt/apt.conf.d/docker-clean \t&& echo 'Dir::Cache::pkgcache \"\"; Dir::Cache::srcpkgcache \"\";' >> /etc/apt/apt.conf.d/docker-clean \t\t&& echo 'Acquire::Languages \"none\";' > /etc/apt/apt.conf.d/docker-no-languages \t\t&& echo 'Acquire::GzipIndexes \"true\"; Acquire::CompressionTypes::Order:: \"gz\";' > /etc/apt/apt.conf.d/docker-gzip-indexes \t\t&& echo 'Apt::AutoRemove::SuggestsImportant \"false\";' > /etc/apt/apt.conf.d/docker-autoremove-suggests"
    },
    {
      "created": "2018-06-05T21:20:52.712120056Z",
      "created_by": "/bin/sh -c rm -rf /var/lib/apt/lists/*"
    },
    {
      "created": "2018-06-05T21:20:53.405342638Z",
      "created_by": "/bin/sh -c sed -i 's/^#\\s*\\(deb.*universe\\)$/\\1/g' /etc/apt/sources.list"
    },
    {
      "created": "2018-06-05T21:20:54.091704323Z",
      "created_by": "/bin/sh -c mkdir -p /run/systemd && echo 'docker' > /run/systemd/container"
    },
    {
      "created": "2018-06-05T21:20:54.310450149Z",
      "created_by": "/bin/sh -c #(nop)  CMD [\"/bin/bash\"]",
      "empty_layer": true
    }
  ],
  "os": "linux",
  "rootfs": {
    "type": "layers",
    "diff_ids": [
      "sha256:db9476e6d963ed2b6042abef1c354223148cdcdbd6c7416c71a019ebcaea0edb",
      "sha256:3a89e0d8654e098e949764b1cb23018e27f299b0931c5fd41c207d610ff356c4",
      "sha256:904d60939c360b5f528b886c1b534855a008f9a7fd411d4977e09aa7de74c834",
      "sha256:a20a262b87bd8a00717f3b30c001bcdaf0fd85d049e6d10500597caa29c013c5",
      "sha256:b6f13d447e00fba3b9bd10c1e5c6697e913462f44aa24af349bfaea2054e32f4"
    ]
  }
}

在弄清这里发生的事情时提供的任何帮助将不胜感激。

谢谢。

2 个答案:

答案 0 :(得分:3)

我无法告诉您为什么会发生这种情况,但是jq解析输入文件的方式似乎有问题。读取文件时出现段错误。这是Windows构建中的known issue,其中文件路径的长度触发了问题。

幸运的是,可以通过将脚本修改为go against all conventional wisdom并将脚本cat修改为jq来解决此问题。

该脚本不能很好地利用jq并手动构建一些json,因此需要一些其他修复程序。解析时,它将与INVALID_CHARACTER有关。这可能是this issue的体现,因为脚本是手动构建许多jq程序。

我用updated file写下了一个要点,至少没有出错,请检查它是否按预期工作。

更改从172342行开始。

构建清单的方式很混乱。我已经清理了一下,删除了所有字符串插值,而是将所有参数作为参数传递给jq。

# munge the top layer image manifest to have the appropriate image configuration for older daemons
local imageOldConfig="$(cat "$dir/$imageId/json" | jq --raw-output --compact-output '{ id: .id } + if .parent then { parent: .parent } else {} end')"
cat "$dir/$configFile" | jq --raw-output "$imageOldConfig + del(.history, .rootfs)" > "$dir/$imageId/json"

local manifestJsonEntry="$(
    jq --raw-output --compact-output -n \
        --arg configFile "$configFile" \
        --arg repoTags "${image#library\/}:$tag" \
        --argjson layers "$(IFS=$'\n'; jq --arg a "${layerFiles[*]}" -n '$a | split("\n")')" \
        '{
            Config: $configFile,
            RepoTags: [ $repoTags ],
            Layers: $layers
        }'
)"

答案 1 :(得分:0)

(1)我已经验证了使用bash的顺序:

addJson='{ id: "ee6b1042efee4fb07d2fe1a5079ce498567e6f5ac849413f0e623d4582da5bc9",
  parent: "80a2fb00dfe137a28c24fbc39fde656650cd68028d612e6f33912902d887b108" }'

jq "$addJson + ." configFile > layerId.json

成功,其中configFile具有更新的问题中显示的内容。

(2)同样,我已经验证以下内容也可以成功:

imageOldConfig="$(jq --raw-output --compact-output '{ id: .id } + if .parent then { parent: .parent } else {} end' layerId.json)"

jq --raw-output "$imageOldConfig + del(.history, .rootfs)" <<-'EOJSON'
<JSON as in the question>
EOJSON

其中<JSON as in the question>代表问题中显示的JSON。

(3)通常,通过shell字符串插值将shell $变量传递给jq程序不是一个好主意。

例如,而不是写:

jq --raw-output "$imageOldConfig + del(.history, .rootfs)"

写这样的东西会更好:

jq --raw-output --argjson imageOldConfig "$imageOldConfig" '
    $imageOldConfig + del(.history, .rootfs)'