Dockerfile mysql, fedora

Fórumok

Üdv,

Fedora konténerben mivel lehet indítani a mysql-servert?

FROM fedora:latest

RUN dnf install mysql-server -y

ENTRYPOINT ["..."]

A "mysld" operation not permitted üzenetet ad.

Hozzászólások

megnézted h a systemd unit mit akar behúzni?

alapvetoen a systemd nem fog elindulni a containeren belul ket okbol:

1. Neki kell lennie a PID1 -nek, de ehhez systemd-vel kell bootolni a rendszert, azaz az /sbin/init kell az entrypointba (kulonben: "System has not been booted with systemd as init system (PID 1)"  meg "Host is down")

2. A fentivel meg mindig nem fog mukodni, mert a systemd-nek szuksege can a sysfs-en levo cgroups-ra, azaz bele kellene mountolni a containerbe. Ha ezt rw-ben teszed mar el is van baszva a hostod, szoval legyen inkabb ro-ban mountolva

3. A fentiekhez persze kell, hogy az egesz hobelebanc privileged modban fusson, ami egy kb tokonszuras security szempontbol

Ha mindezek mellett meg mindig kotod az ebet a karohoz, hat rajta :D

Ha kezzel akarod inditani akkor arra ott a "mysqld" parancs amivel a systemd is inditja. De egy containeren belul kurva sok mindennek ott kell lennie hozza, amit mondjuk az official mysqld image megcsinal neked (csak nezz ra a github-jara, nem szarral gurigaznak)

A fedora image nem tudom milyen, a redhat-ubiba egyébként bele van gyógyítva a systemd. Nem tudom, mennyire jajj, nyilván azért csinálták, hogy a legacyt könnyen lehessen konténerbe tenni. De rémlik, hogy egy darabig a systemdnél is ment a matek, hogy ez azért usecase, lehet, hogy nem kő undor ma már

annyi az egesz, hogy antipattern. A kontenerizacio lenyege hogy izolalva futtassunk egyetlen process-t bezarva a sajat vilagaba (namespaces) adott erofirrasokat engedejezve neki (cgroups) es capability-ket. Egyet. Ha mgedoglik az a jo, nem akarjuk hogy ujrainduljon (bar mar ugy ez is lehetseges)

Mit irtam is. A docker es tarsai "ugyanazt" csinalja, mint a systemd. Kihasit cgroup-ot, namespace-be tesz, es felugyeli a container process-t ha kell. Semmi ertelme egy container-nek amiben 30 darab szerviz fut es ha megdoglenek, akkor majd a systemd mindegyiket ujrainditgatja. Ezzel el is jutottunk a virtualizaciohoz. De ha meg ekkora mennyisegu process-t kell futtatgatni, akkor sem celszeru egyetelen konteiner-be belepakolni mindent, szoval akkor meg ott a dockercompose, swarm, k8s, etc. Hogy megint csak egyetelen process-t futtassunk foreground-ban egyetlen containerkent, de abbol szamosat.

Nem "ko undor"-rol van szo, hanem hogy olyan, mintha autoval akarnal kenyeret megvajazni. Lehet persze :D

Régi melóhelyemen ősrégi fedora alatt futott az ősrégi legacy mysql.

A fejlesztői környezetekhez abban raktam össze mindent, a legrégebben fellelhető dockeres fedora-ban raktam össze én is amit lehetett. Szerencsére végül sikerült átállni 8-asra és utána már nem kellett.

Szóval ez pl lehet indok.

 

Kérdezőnek:

Viszont a kérdés itt nem az ,hogy dockerben hogy lehet elindítani, hanem az, hogy fedora alatt hogy lehet, annak kell utánanézni. Google alatt valszeg fél perc. Nekem nincs hozzá kedvem.

ugye itt az a baj, hogy a docker egyetlen process-t indit foreground, azaz ha az kell, hogy egy process supervisor inditsa a docker helyett, akkor bezony azt be kell konfigolni, meg gondozni is kell. De az egesz ott szarodik el, hogy ennek semmi ertelme. Egy container egy process. Nincs init, nincs process provisioning (jo, lehet supervisrod vagy akar systemd is). De mondom, semmi ertelme systemd-t inditani egy containerben, hogy elinditson egy process-t es esetleg ujra-es-ujra inditgassa ha az szar. Akkor bezony annak meg kell doglenie ha baja van. 

Amugy a podman tamogatja a systemd-t (de megint csak minek is?). A systemd cgroup-ol, namespace-el es elindit egy process-t, he varj, ugyanezt csinalja a docker is vagy a podman. :D

Amubgy Fedora-n ugyanugy indul mint mindenhol mashol, systemd start mysql.service :D 

hogy indítod el a konténert?

próbáld:

docker run --cap-add=sys_nice -d kontenernev

4 és fél éve csak vim-et használok. elsősorban azért, mert még nem jöttem rá, hogy kell kilépni belőle.

A kerdes itt arra vonatkozott hogy inditja el a containeren belul a myslq-t. Itt aztan bedobtak a systemd-t ami nem jo otlet. Lehet talpasan is elinditani (man mysqld), de kurvara sok mindent kell meg ballitani utana ha hasznalni is akarja. Ezt oldana meg az official mysql image. Ha nagyon akarja akkor az elejere odavagja a fedora image-et  FROM-ba es atirja az osszes shell scriptet meg minden istennyilat fedorasra. De minek, az istenert minek????!!!?!?!?!?!

Nekem közben felugrott pár emlék régebbről pont amikor még fedora alatt dockereztem régi mysql-el, hogy számított az is, hogy hogyan mountolom az adatokat. Pl a full mysql-es data könyvtárat nem lehetett felmountolni mert oda akarta tenni a process fájlokat vagy mit és azt nem bírta. Így a cnf-ben külön át kellett írni, hogy hol van a data mappa és azt lehetett mountolni.

Nem tudom, hogy nálad ilyen gond van e, ha mountolsz, akkor kezdetnek kommenteld vagy vágd ki az összes mount pontot és próbáld úgy, hogy mi történik.

ismetlem magam:

1. irany a github es nezd meg az official-t

2. az alapjan ganyold ossze amit szeretnel

Amugy az operation not permitted helye es ideje elegge beszedes szokott lenni a logokban. Az egyik dolgo lehet ugye, hogy a container egy bizonyos user ID-val fut, vagy a benne levo process, ami aztan hozza aakr ferni mondjuk a mlountolt volume-hoz amit viszont a host jogosultsagi rendszere megfog (megoldas az ACL). Aztan lehet az is ugye, hogy a mysql process fut a 1000-es UID-el es letre akarja hozni a db-t a container filerendszereben, de ugye ott mindent a UID XXXX (fasz se tudja) birtokol. Es akkor meg ezer masik dolgot nem is emlitettunk, mint peldaul a socket letrahozasat (unix vagy tcp? es ha TCP mapped port tuti hasznalhato neki? stb stb) 

A fenti hibak mindegyike siman megoldhato ha tudod miert irja ki az opertaion not permitted-et

Azert egy operation not permitted-hez meg nem kell strace :D

Valoszinuleg filerendszer jogosultsagi problemaja van a mysqld-nek a kontaineren belul. Szerintem meg kellene neznie milyen userrel fut a container es milyen user-rel akar futni a mysql service (meg megnezni hogy a my.cnf-ben hol van a data dir). Meg ha mountolt volume akkor azon hogyan allnak a jogosultsagok a host-on.

Az operation not permitted tipikusan a db letrahozasa/inicializalasa vagy a socket krealasakor jon elo, ha nincs meg a jogosultsag

Na kidebuggoltam neki:

[root@22ab9cc1cc1a /]# cat /etc/redhat-release 
Fedora release 40 (Forty)
[root@22ab9cc1cc1a /]# mysqld -v
bash: /usr/sbin/mysqld: Operation not permitted
[root@22ab9cc1cc1a my.cnf.d]# grep datadir mysql-server.cnf 
datadir=/var/lib/mysql
root@22ab9cc1cc1a my.cnf.d]# su - mysql -s /bin/bash
[mysql@22ab9cc1cc1a ~]$ id
uid=27(mysql) gid=27(mysql) groups=27(mysql)
[mysql@22ab9cc1cc1a ~]$ cd /var/lib/mysql
[mysql@22ab9cc1cc1a mysql]$ touch xxx
[mysql@22ab9cc1cc1a mysql]$ # Ez bezony megyen
[mysql@22ab9cc1cc1a mysql]$ cd
[mysql@22ab9cc1cc1a ~]$ /usr/libexec/mysqld --log-error-verbosity=3 --console
bash: /usr/libexec/mysqld: Operation not permitted

Szoval bezony maga a binaris keptelen megcsinalni a dolgokat, de miert is? Mert bezony a containernek nincs meg a capabilitije hozza

Ha "--privileged" akkor meg siman indulna, de bezony ott meg az a baj, hogy root-kent nem akarja futtatni magat :D

$ podman run --privileged --name mysql -d fedora:latest /bin/sh -c "while true; do sleep 5000;done"
505e08d85ba2f18a2bf3389ac1b87ab82349c30bda98e34f85c2474a6038ca1c
$ podman exec -ti mysql /bin/bash                                                      
[root@505e08d85ba2 /]# dnf install -y mysql-server
...
[root@505e08d85ba2 /]# mysqld
2024-10-04T07:05:37.423911Z 0 [System] [MY-010116] [Server] /usr/libexec/mysqld (mysqld 8.0.39) starting as process 239
2024-10-04T07:05:37.425570Z 0 [ERROR] [MY-010123] [Server] Fatal error: Please read "Security" section of the manual to find out how to run mysqld as root!
2024-10-04T07:05:37.425622Z 0 [ERROR] [MY-010119] [Server] Aborting
2024-10-04T07:05:37.425830Z 0 [System] [MY-010910] [Server] /usr/libexec/mysqld: Shutdown complete (mysqld 8.0.39)  Source distribution.

Szoval tehat a megoldas hogy a containernek meg kell adni a CAP-et es kesz, de ne inditsuk privileged-del :D

Köszönöm a segítséget! Elindult:

# Dockerfile

FROM fedora:latest

RUN dnf update -y && dnf install ... mysql-server -y
# RUN mkdir -p /var/run/mysql /var/lib/mysql && chown -R mysql:mysql /var/run/mysqld /var/lib/mysql
RUN setcap -r /usr/libexec/mysqld
RUN mysqld_pre_systemd

EXPOSE 3306

ENTRYPOINT ["mysqld","-u","root"]

Persze finomítani lehet rajta. ;)