docker - Der Docker-Build-Cache wird beschädigt, sobald das Image in einem Container verwendet wird. Warum? Wie vermeiden?

CorePress2024-05-09  8

Docker build cache is busted once the image is used in a container. Why? How to avoid?

Ich erstelle ein Image mit einer RUN-Phase, in der nur Pakete geladen werden, und einer weiteren, die einige Initialisierungen durchführt. Wenn ich sofort neu aufbaue, wird der Cache für die Stufen ordnungsgemäß verwendet. Für die spätere Initialisierungs-RUN-Phase habe ich einen „manuellen Bust“ eingerichtet. Wenn ich an diesem Punkt kaputt gehe, wird der Cache für alle vorherigen Phasen verwendet. Es funktioniert wie vorgesehen einwandfrei

ABER

Wenn ich dieses Image in einem Container verwende und dann zurückgehe und das Image erstelle, wird der gesamte Cache zerstört und das gesamte Image wird neu erstellt. Ich möchte, dass das nicht passiert, da die Paketinstallation am längsten dauert und nicht immer wieder erforderlich ist.

Kurz gesagt, ich möchte das Image testen und wenn es Probleme gibt, nur die letzte Initialisierungs-RUN-Phase neu erstellen, nicht die, die Pakete installiert, aber sobald ich das Image verwende, ist der gesamte Cache kaputt.

Warum passiert das? Gibt es eine Möglichkeit, ein Image zu verwenden, aber den Build-Cache beizubehalten? Ich frage mich, warum das Ausführen eines Images in einem Container etwas mit dem Build-Cache zu tun hat?

ARG BASE_IMAGE
FROM $BASE_IMAGE
ARG BASE_IMAGE
ARG KEEP
ARG SYSADMIN_PW
ARG LINUX_DISTRO=alpine
ARG BUILD_DIR=/build 
WORKDIR $BUILD_DIR
COPY .src ./

# PACKAGES
RUN echo -e "\n ************************************************* \n"\
    echo "****** Building Image from Base: $BASE_IMAGE; : Distro: $LINUX_DISTRO; *****"; \
    echo " ---- running packages install script ---"; /bin/sh ./packages.sh; \
    echo -e "\n********************************************************" 
# END PACKAGES    

ARG BUST_INIT_CACHE

# INITIALIZATION
RUN echo -e "\n ************************************************* \n" \
    echo "****** BUST_INIT_CACHE ${BUST_INIT_CACHE} "; \
    echo "****** Running Initialization Script "; \
    chmod -R +x .; \ 
    pwd; ls -la; \
    echo " ---- running init script ---"; /bin/bash ./init.sh; \
    echo -e "\n********************************************************" 
# END INITIALIZATION    

VOLUME [ "/data", "/opt", "/shell" ]
WORKDIR /opt
# ENTRYPOINT ["entrypoint.sh"]
CMD ["/bin/bash", "-l"]


-----------------------------------

Die Frage sollte die Build-Ausgabe enthalten, die zeigt, wo der Cache-Fehler auftritt, und die reproduzierbaren Schritte, die zum Erstellen des Images unternommen wurden.

-----

Ein Beitrag im Docker-Forum gab den Hinweis. Der Kopierbefehl war das Problem. Ich habe den Cache in meiner Kopieranweisung ungültig gemacht.

Ich brauchte zwei Kopieranweisungen. Ich muss das Paket und die Init-Skripte über ihre eigenen Unterordner kopieren. Wenn ich dann etwas im Init-Skript-Unterordner des Pakets geändert habeDer Kopierbefehl wird nicht ungültig gemacht.

Damit ist auch das Problem gelöst, dass ein Container ausgeführt und der Cache ungültig gemacht wird. Der Nebeneffekt besteht darin, dass ich dieses manuelle Cache-Busting nicht mehr benötige, da dies durch einfaches Ändern von irgendetwas im Init-Skriptordner erledigt wird.

COPY .src/packages ./packages
# PACKAGES
RUN \
    echo -e "\n ************************************************* \n"\
    echo "****** Building Image from Base: $BASE_IMAGE; : Distro: $LINUX_DISTRO; *****"; \
    echo " ---- running packages install script ---"; /bin/sh ./packages/packages.sh; \
    echo -e "\n********************************************************" 
# END PACKAGES    

COPY .src/init ./init

# INITIALIZATION
RUN echo -e "\n ************************************************* \n" \
    echo "****** Running Initialization Script "; \
    chmod -R +x .; \ 
    pwd; ls -la; \
    echo " ---- running init script ---"; /bin/bash ./init/init.sh; \
    echo -e "\n********************************************************" 
# END INITIALIZATION    


-----------------------------------

Your guide to a better future - quark24
Your guide to a better future - quark24