批处理脚本在 Dockerfile 构建过程中无法运行

3

我有一个简单的BATCH脚本,用于执行SHA256校验和测试。

@echo off
setlocal enabledelayedexpansion

::Batch script to compare a file SHA256 checksum to a given one.
::Usage: checksum [FILE] [VALUE]

set filepath=%1
set checksum=%2
set idx=0

for /f %%F in ('certutil -hashfile %filepath% SHA256') do (
    set "out!idx!=%%F"
    set /a idx += 1
)
set filechecksum=%out1%

if /i %checksum%==%filechecksum% (
    echo %checksum% validated.
) else (
    echo Checksum validation falied.
    exit 1
)

我在一个Dockerfile中调用它来验证自己:

FROM mcr.microsoft.com/windows/servercore:1909-amd64

COPY checksum.bat /
RUN /checksum.bat /checksum.bat 2b9dadc0b74dc25bd94552817b68c57df9c324ba28656c10ec787adf5611f3ec

这是我的输出结果:
$ docker image build -t gsscoder/test:v0_0 .

Sending build context to Docker daemon  3.072kB
Step 1/3 : FROM mcr.microsoft.com/windows/servercore:1909-amd64
 ---> 9c2075893694
Step 2/3 : COPY checksum.bat /
 ---> 2224010db712
Step 3/3 : RUN /checksum.bat /checksum.bat 2b9dadc0b74dc25bd94552817b68c57df9c324ba28656c10ec787adf5611f3ec
 ---> Running in eb60dd5fe468
Checksum validation falied.
The command 'cmd /S /C /checksum.bat /checksum.bat 2b9dadc0b74dc25bd94552817b68c57df9c324ba28656c10ec787adf5611f3ec' returned a non-zero code: 1

如果我删除RUN命令,并直接在容器或主机操作系统中尝试,则会得到预期的正确结果。
.\checksum.bat .\checksum.bat 2b9dadc0b74dc25bd94552817b68c57df9c324ba28656c10ec787adf5611f3ec

2b9dadc0b74dc25bd94552817b68c57df9c324ba28656c10ec787adf5611f3ec validated.

在构建过程中为什么字符串比较或其他操作会失败?

我非常好奇,请问有什么解释吗?

提前感谢您的任何帮助!

附言:我知道可以通过其他方式(例如使用PowerShell),但我想知道为什么采用这种方法不起作用。


你尝试过将.bat文件复制到“。”,然后在没有加“/”前缀的情况下运行它吗? - Faeeria
1
我建议在你的错误信息中打印参数。 - Nick.McDermaid
1个回答

4
如果你的代码失败了,添加一些调试输出总是一个好主意。
然后你会看到一个 RUN /checksum.bat ... 的结果稍微有点不同。 out1 没有设置,因为 crtutil ... /checksum.bat 失败了。
CertUtil: Unknown arg: /checksum.bat

你需要更改的全部内容:

RUN /checksum.bat C:\checksum.bat 2b9dadc0b74dc25bd94552817b68c57df9c324ba28656c10ec787adf5611f3ec

是的,你说得对,它起作用了。谢谢!我可以问一下你添加了什么样的调试“echo”来发现问题吗? - gsscoder
2
@gsscoder 我在循环中添加了 echo "out!idx!=%%F" - jeb

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接