FROM-Zeile in Dockerfile

newbi2009

New member
Hallo zusammen,

ich lesen mich jetzt seit einigen Tage in die Thematik "Docker" ein...... Habe aber doch die eine oder andere Verständnisfrage. In der Hoffnung, dass mir die hier benatwortet werden können folgendes:
Wenn ich das korrekt verstanden habe, sieht die FROM-Zeile in dem Dockerfile so, oder so ähnlich aus, wenn man das Image mit einem Betriebssystem (in diesem Fall Ubuntu) betanken will:
FROM ubuntu:latest
Wenn man jetzt KEIN Betriebssystem als "Unterbau" braucht, sondern z.B. eine MySQL Datenbank "bauen" will (die später sowieseo auf einem Ubuntu laufen soll), sieht die Zeile so, oder so ähnlich aus:
FROM mysql:latest

In beiden Fällen wird jeweils die aktuellste Version der jeweiligen Software (Ubuntu bzw. MySQL) aus dem Repository oder dem Docker Hub (das habe ich noch nicht wirklich verstanden, woher die Software geladen wird) heruntergeladen.

Was aber, wenn ich eine Software im Image /Container haben möchte, die es dort nicht (mehr) gibt?
Ich bleibe einmal bei dem Beispiel MySQL: Die Alt-Version mysql 5.1.51 (zum Beispiel) scheint es nicht mehr online (im Repository oder Hub) zu geben.
Wohl aber noch die Datei mysql-5.1.51-linux-x86_64-glibc23.tar.gz als download auf der MySQL-Seite.
Wenn man sich diese Datei nun herunterlädt und im Dockerfile zum einbinden benennen will, wie funktioniert das dann?

Vielen Dank und Gruß
Holger
 
Hi,

vorab: Bin kein Docker-Spezi, aber vielleicht einen Schritt weiter als Du 🙃
(das habe ich noch nicht wirklich verstanden, woher die Software geladen wird)
Das kommt aus einer entsprechenden Registry (in diesem Fall von docker.com).
Wenn man sich diese Datei nun herunterlädt und im Dockerfile zum einbinden benennen will, wie funktioniert das dann?
Du nimmst ein Basis-Image (z.B. Alpine, oder was auch immer Dir zusagt) und baust Dir anhand dessen Dein gewünschtes Image. Wenn Du einmal z.B. hier schaust, siehst Du auf der linken Seite die einzelnen Schichten des Image (ein Image besteht immer aus diversen Schichten). Dort wird dann in Layer 10 der MySQL-Server installiert (wenn Layer 10 anklickst und dann rechts oben auf "Packages" klickst, siehst Du, welche Pakete dort installiert werden).

Wenn Du also so eine alte MySQL-Version als Docker-Image haben willst und niemand sonst etwas vergleichbares bereitstellt, wirst Du nicht daran vorbei kommen, dass Du Dir selbst ein Image bauen musst. Einen kleinen Einstieg dazu findest Du z.B. hier: https://docs.docker.com/get-started/02_our_app/

Wenn Du möchtest, kannst Du Dir auch noch eine private Registry bereitstellen (https://hub.docker.com/_/registry), so habe ich damit auch angefangen. So kannst Du Dein erstelltes Image dann in Deine eigene Registry pushen und Dein Image dann entsprechend aus Deiner Registry holen. Ich bin da mittlerweile aber auf eine etwas umfangreichere Registry umgestiegen. Einzige Unterschied ist dann später, dass man z.B. statt "mysql/mysql:5.1.51" die Angabe um den Hostteil erweitern muss, z.B. "<registry-host>:5000/mysql/mysql:5.1.51" (die o.g. Registry läuft standardmässig auf Port 5000).

So, hoffe, dass das erstmal ein bisschen geholfen hat (und ich keinen Mist erzählt habe) 😄

EDIT: Bei den Layern siehst Du übrigens auch ganz oben, dass es nicht "nur" einfach die "App" MySQL ist, sondern als Basis das Image "oraclelinux:8-slim" dient.
 
Hi blurrrr,

erstmal vielen Dank für diese Info..... Aber irgendwie hiesse das ja dann, dass ich tatsächlich IMMER ein BS als Unterbau benutzen müsste?
Das macht aber doch wenig Sinn. Das bläht doch das Image/Container nur unnötig auf, weil ich die Anwendung ja eh auf einem Betriebssystem(LINUX) laufen lassen will - da muss ich doch nicht nochmal ein LINUX da drunter legen?!
Wie würde denn die FROM-Zeile aussehen, wenn ich die heruntergeladene Datei mysql-5.1.51-linux-x86_64-glibc23.tar.gz einbinden will?
Das wäre für mich erstmal der nächste Schritt, damit ich bei meinen Versuchen weiter komme.....

Danke nochmal und Gruß
Holger
 
Das wird so nicht funktionieren, denn die FROM-Zeile gibt die Grundlage an, auf welcher dann weiter aufgebaut wird. Schau vielleicht mal hier rein: https://docs.docker.com/build/building/base-images/. Mitunter hat MySQL 5 noch irgendwelche älteren Abhängigkeiten und das ganze läuft auf einem aktuellen OS nicht mehr, das ist aber auch nur eine Vermutung und muss so nicht korrekt sein. Davon ab... die Basis/Parent-Images sind superschmal, ist ja nicht so als würdest Du da tonnenweise Zeugs installieren. Als Beispiel: Das Image "php:8.3.4-cli-alpine" hat grade mal 34,5MB (Basis Alpine, das kommt mit knapp 3MB daher...). Das Image "mariadb:latest" hat als Unterbau "ubuntu:jammy", das liegt bei knapp 30MB. Ich denke, sowas ist durchaus zu verschmerzen... ;)
 
okay, dann versuche ich das mit dem Basisimage.....ist aber immer noch mein Hauptproblem: Wie bekomme ich die heruntergeladene MySQL-tar.gz-Datei als Datenbank in mein Image?
 
Naja, die Frage wäre ja schon grundsätzlich, wie es "generell" zu installieren ist. Du kannst es vorher entpacken, dann ins Image schubsen und installieren, oder Du schmeisst erstmal alles ins Image, machst dort alles und räumst danach wieder auf. Ich hatte Dir schon einen Link geschickt (https://docs.docker.com/get-started/02_our_app/), ist da evtl. etwas unglücklich gelaufen, da dort nur "copy . ." steht. Faktisch kannst Du es aber einfach via "Copy <Quelle auf dem Host> <Ziel im Container>" erledigen.

Als kleines Beispiel: Angenommen Du hast auf dem Docker-Host ein Arbeitsverzeichnis in Form von "/opt/mein-image/", dort liegt die Datei "mysql.tgz". Im Container soll das ganze dann ebenfalls unter "/opt/" landen. Dann wäre es im Dockerfile die Zeile:
COPY /opt/mein-image/mysql.tgz /opt/mysql.tgz
Der nächste Schritt wäre dann eben das entpacken der Datei via:
RUN <Datei entpacken>
Worauf vermutlich die Paket-Installation erfolgt, erneut via RUN:
RUN <Paketverwaltung -> Install -> Dateiname>
usw.

Beim COPY kannst Du auch noch weitere Parameter angeben, wie z.B. "COPY --chmod=0755 <Quelle> <Ziel>", gleiches gilt auch für die anderen Instruktionen. Mehr dazu findest Du in der entsprechenden Doku: https://docs.docker.com/reference/dockerfile/ :)
 
Kennst Du schon den Post Unterschiede VMs vs. Container?

Ich sehe hier drei Optionen:

1. Kein eigenes Image bauen, da MySQL 5.1 seit 31.12.2013 EOL ist und nicht mehr supportet wird (Stichwort: totes Pferd reiten)
2. Das Git-Repository des offiziellen Docker-Images als Grundlage für eigene Anpassung verwenden: https://github.com/docker-library/mysql
3. Ein eigenes Image auf der grünen Wiese bauen.

Bei 2) könntest Du in der Commit-Historie des Git-Projektes mit Glück auch noch Commits finden, die zu dem passen, was Du vorhast. Dann einfach lokal clonen, entsprechenden checkout auf die entsprechende commitid machen und dann mit Glück erfolgreich das Image bauen.

Bei 3) ist die Empfehlung das tar.gz innerhalb einer RUN Anweisung innerhalb des Dockerfiles herunterzuladen, auszupacken. Der Inhalt der RUN Anweisung entspricht dabei Kommandozeilenbefehlen. Zusätzlich willst Du noch ein Bash-Skript haben, dass Du beim Start des Containers als ENTRYPOINT Anweisung nutzen kannst, um Konfigurationen zu setzen (oder was auch immer nötig ist), um am Ende mysqld damit zu starten (das kannst Du dir aber auch aus dem Git-Repo abkupfern).

Ich persönlich würde da keine Zeit hereinstecken, sondern zusehen, dass die Anwendung die alte MySQL Version benötigt, ertüchtigt wird mit der neuen MySQL Version klarzukommen.

Wenn es Dir natürlich nur ums Lernen geht, und Du gewillt bist beliebig Zeit in das Thema zu investieren, dann ist es sicherlich keine unspannende Aufgabe.
 
Oder nimm einfach, wie Dir bereits an anderer Stelle schon gesagt wurde, das fertige Image "tommi2day/mysql51:5.1.51" (das sollte auch einfach auf Deiner Syno funktionieren). Basteln kannst natürlich auch, ist natürlich auch ein gewisser Lerneffekt ☺️
 

Zurzeit aktive Besucher

Letzte Anleitungen

Statistik des Forums

Themen
4.616
Beiträge
47.273
Mitglieder
4.262
Neuestes Mitglied
jungerm
Zurück
Oben