J'ai un simple script de script BATCH qui effectue un test de somme de contrôle 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
)

Je l'invoque dans un Dockerfile pour se valider:

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

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

Voici la sortie que j'obtiens:

$ 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

Si je supprime la commande RUN et l'essaie directement dans le conteneur ou le système d'exploitation hôte, j'ai le résultat correct:

.\checksum.bat .\checksum.bat 2b9dadc0b74dc25bd94552817b68c57df9c324ba28656c10ec787adf5611f3ec

2b9dadc0b74dc25bd94552817b68c57df9c324ba28656c10ec787adf5611f3ec validated.

Pourquoi la comparaison de chaînes ou autre chose échoue pendant le processus de construction?

Je suis très curieux de savoir.

Merci d'avance pour votre aide!

P.S .: Je sais que je peux le faire par d'autres moyens (comme utiliser PowerShell ), mais je veux savoir pourquoi de cette façon cela ne fonctionne pas.

2
gsscoder 13 mars 2021 à 12:39

1 réponse

Meilleure réponse

Si votre code échoue, c'est toujours une bonne idée d'ajouter une sortie de débogage.

Ensuite, vous voyez qu'un RUN /checksum.bat ... donne une sortie légèrement différente.

out1 n'est pas défini, car crtutil ... /checksum.bat a échoué avec

CertUtil: Unknown arg: /checksum.bat

Tout ce que vous avez à changer:

RUN /checksum.bat C:\checksum.bat 2b9dadc0b74dc25bd94552817b68c57df9c324ba28656c10ec787adf5611f3ec
2
jeb 13 mars 2021 à 15:26