代码之家  ›  专栏  ›  技术社区  ›  4c74356b41

如何把“逃出地狱”交给docker run

  •  0
  • 4c74356b41  · 技术社区  · 6 年前

    示例命令,实际的命令是一行,我正在拆分它以便更容易查看:

    docker run neilpang/acme.sh bin/sh -c --%
      "acme.sh --issue --dns dns_azure --dnssleep 10 --force -d "domain";
      openssl pkcs12 -inkey /acme.sh/domain/domain.key -in /acme.sh/domain/domain.cer -export -out pfx -password pass:password;
      curl -X POST -d "{\"certName\":\"certName1\",\"certData\":\"$(tail -n +2 /acme.sh/domain/domain.cer > b64; head -n -1 b64)\"}" url -H Content-Type:application/json;
      curl -X POST -d "{\"certName\":\"certName2\",\"certData\":\"$(openssl base64 -in pfx -out b64; cat b64)\"}" url -H Content-Type:application/json"
    

    我试过的:

    1. 在json周围使用单引号很好,但是 $()
    2. 逃逸 " json之前/之后
    3. " 在json之前/之后,会导致一些垃圾
    4. 我从来没有在没有 --% ,但看起来ps甚至在使用
    5. 用cmd做了一些实验,也没有运气。

    我愿意以任何方式来完成这项工作:)

    对于那些请求错误的人,下面是一个示例:

    -n: line 1: syntax error: unexpected end of file (expecting ")") # quotes around expression
    -p: line 1: syntax error: unterminated quoted string # single quotes around expression
    no error, but certData empty # no quotes around json
    no quotes in json >> not valid json >> doesnt get parsed # escaped quotes around json
    

    执行我试图在容器中传递的字符串会产生有效的“解决方案”,而试图传递它们 docker run 导致上述不同的缺陷。我不确定这些东西是从哪里来的,来自powershell(尽管,我坚信 在这里工作,powershell正确地传递所有内容)、docker或bash本身。我最接近工作的是 ' 版本,但它不计算内部的表达式 $() ,所以这个问题

    2 回复  |  直到 6 年前
        1
  •  2
  •   David Maze    6 年前

    如果您将非常长、非常复杂的命令行转换为shell脚本,将其打包为自定义图像,然后运行该脚本,您会发现引用问题会变得非常容易。

    Shell脚本,我们称之为 run_acme.sh :

    #!/bin/sh
    acme.sh --issue --dns dns_azure --dnssleep 10 --force -d "domain"
    openssl pkcs12 \
      -inkey /acme.sh/domain/domain.key \
      -in /acme.sh/domain/domain.cer \
      -export \
      -out pfx \
      -password pass:password
    CER_B64=$(tail -n +2 /acme.sh/domain/domain.cer | head -n -1)
    curl -X POST \
      --data-binary "{\"certName\":\"certName1\",\"certData\":\"$CER_B64\"}" \
      -H 'Content-Type: application/json'
      url
    PFX_B64=$(openssl base64 -in pfx)
    curl -X POST \
      --data-binary "{\"certName\":\"certName1\",\"certData\":\"$PFX_B64\"}" \
      -H 'Content-Type: application/json'
      url
    

    FROM neilpang/acme.sh
    COPY run_acme.sh /bin
    CMD ["/bin/run_acme.sh"]
    

    那你就可以 docker build 这和其他任何自定义图像一样,而且 docker run 它和非常长的命令行将被烘焙到您图像中的shell脚本中。

        2
  •  1
  •   Maximilian Burszley    6 年前

    我建议使用飞溅,使这一点显着清洁维护。注意:我不确定您的shell脚本是否需要在 -d 参数。

    $curl1 = '"{\"certName\":\"certName1\",' +
        '\"certData\":\"$(tail -n +2 /acme.sh/domain/domain.cer > b64; head -n -1 b64)\"}"'
    $curl2 = '"{\"certName\":\"certName2\",' +
        '\"certData\":\"$(openssl base64 -in pfx -out b64; cat b64)\"}"'
    
    $dockerArgs = @(
        'run', 'neilpang/acme.sh', 'bin/sh', '-c'
        '"acme.sh --issue --dns dns_azure --dnssleep 10 --force -d "domain";' +
        'openssl pkcs12 -inkey /acme.sh/domain/domain.key -in /acme.sh/domain/domain.cer ' +
            '-export -out pfx -password pass:password;' +
        "curl -X POST -d $curl1 url -H Content-Type:application/json;" +
        "curl -X POST -d $curl2 url -H Content-Type:application/json"""
    )
    docker.exe @dockerArgs
    

    ` 或者你可以把报价翻一番 "" 转义双引号 "`""