[ CoyoteKG @ 06.05.2019. 15:44 ] @
Kod ovoga sam zapucao. Gledam osnove docker-a pa radi ucenja sam uradio sledece.

build-ovao image od centosa zajedno sa php i apache kako bih stavio wp sajt.

docker build --build-arg http_proxy=http://192.168.1.97:3128 --build-arg https_proxy=http://192.168.1.97:3128 -t my-php-app .

Ovo je dockerfile
Code:

FROM centos:latest
MAINTAINER xxx

# Add epel and remi repo
RUN rpm -Uvh https://dl.fedoraproject.org/p...el-release-latest-7.noarch.rpm \
        && rpm -Uvh https://rpms.remirepo.net/enterprise/remi-release-7.rpm \
        && yum install -y yum-utils \
        && yum-config-manager --enable remi-php73

# Install apache and php
RUN     yum -y update \
        && yum  -y install \
        httpd \
        php \
        php-mysql \
        php-gd \
        && rm -rf /var/cache/yum/* \
        && yum clean all

EXPOSE 80
CMD ["/usr/sbin/httpd", "-DFOREGROUND"]


Mogu da startujem kontejner sa
docker run -dit --rm --name my-wp-app -p 80:80 -v /docker-volumes/wp:/var/www/html my-php-app

Gde mi je /docker-volumes/wp folder na hostu u koji sam smestio WP fajlove.
E nad tim fajlovima zelim da uradim chown apache:apache

Koliko sam video sa dockerfile to ne mogu da uradim.

Pa sam pokusao sa docker-compose kao sledecim korakom ka ucenju i ovo mi je
Code:
---
version: '3.3'
services:
  db:
    image: mysql:5.7
    ports:
      - "3306:3306"
    volumes:
      - /docker-volumes/mysql:/var/lib/mysql
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: pass1
      MYSQL_DATABASE: wpdb
      MYSQL_USER: wpuser
      MYSQL_PASSWORD: pass2

  wp:
    depends_on:
      - db
    image: my-php-app
    ports:
      - "80:80"
    volumes:
      - /docker-volumes/wp:/var/www/html
    restart: always


I to radi OK, oba kontejnera se startuju. ali sad zelim da uradim chown nad tim fajlovima, jer ne mogu da upisem npr wp-config.php prilikom instalacije WP

Probao sam u docker compose fajl u wp: da dodam
Code:
command: chown -R apache:apache /var/www/html 

Onda se samo ta komanda izvrsi, a wp kontejner upadne u restart petlju, a container logs je prazan.

Gde gresim, kako da uspesno posle startovanog kontejnera uradim chown i eventualno chmod nad fajlovima?
[ djoka_l @ 06.05.2019. 18:22 ] @
Mislim da nemam pojma šta želiš da uradiš
1. Napravio si kontejner počevši od centos imidža i dodao apache i php, a nazvao si je my-php-app. A to nije aplikacija, samo Linux, apache i php, aplikacije nigde nema.
2. Zašto nisi izabrao već gotov imidž koji ima apache i php, nego ga praviš od linux imidža?
3. docker file može da uključi COPY komandu, tako da u kontejner spakuješ i svoj php kod, što je normalan način kako se radi. Na volume se stavlja samo ono što je promenljiv deo, na primer konfiguracioni fajlovi i slično.
4. aplikaciju stavljaš na exsterni fajl sistem umesto da je u imidžu.
5. hoćeš da menjaš permisije, a nemaš pojma da li apache grupa i user uopšte postoje u imidžu, kao i da li postoje na host sistemu i da li imaju isti user-id i group-id.

[ plus_minus @ 06.05.2019. 18:27 ] @
edit: djoka_l me preteče pa da dodam, povodom grupa.

U debian distroima apache user/group nije apache, nego je www-data.

U debian based sistemima, apache kao proces jeste apache2, primer: systemctl status|start|stop|reload|restart apache2

U RH, centOS, itd .. apache kao proces ima httpd naziv. systemctl status|start|stop|reload|restart httpd

Neka me ispravi neko ako grešim povodom centOS-a, jer ne radim sa centOS-om, fedorom, itd..

Dakle, user/group za centOS može da bude isti kao i za debian/ubuntu: www-data.

[ djoka_l @ 06.05.2019. 18:35 ] @
Tačno tako, docker kontejner ima svoje usere i svoje grupe i nema veze sa userima i grupama host sistema.
Čak i ako postoje isti useri i iste grupe, njihovi id-ovi ne mora da su isti.

Recimo, postgres kontejner može da napravi postgres bazu na externom sistemu, i daće im (u kontejneru) vlasništvo usera postgres.
Ti ćeš na host fajl sistemu videti da je vlasnik user sa id 1000 kojeg možda i nemaš na host sistemu (njegov id je 1000 u kontejneru) ili ćeš videti nekog potpuno levog usera koji na host sistemu slučajno ima id 1000

Osim toga, nije u redu da ti komanda kojoim startuješ kontejner bude http u forgraundu, verovatno će ti trebati kod debagovanja da pokreneš bash u kontejneru. Startuj httpd na normalan način.
[ CoyoteKG @ 06.05.2019. 19:52 ] @
Što se tiče imena, to je nešto prvobitno ostalo my-php-app gde sam u stvari samo spakovao php info... Nisam kasnije ni menjao, na kraju ću kad spakujem sve da imenujem kako valja :).

Pravio sam ga od linux image kako bih probao te komande i video kako funkcioniše instalacija repozitorijuma, paketa, kasnije bih probao i selinux i slično. Znam da postoje gotovi image-i apache i php. Postoje čak i za WP ali eto za sad nisam hteo tako.

Znam za Copy komandu, prvobitno sam tako uradio, ali sam hteo kasnije efekat takav da mogu da stopiram i pokrenem kontejner bez da izgubim bilo šta, i zamislio sam da tako u stvari treba i zbog CI/CD. Lakše mi da spustim fajlove direktno na hostu nego u docker. Verovatno što se.tiče WP je dovoljno wp-content folder dovoljno da bude na eksternom fajl sistemu, ali eto pomislih što da ne ceo www folder. Ionako bih opet imao isti problem nad tim wp-content folderu sa permisijama.

Znam da je apache user jer sam pre svega pokrenuo kontejner iz tog image i proverio. Kad iz kontejnera promenim ownera nad fajlovima i folderima host to vidi kao 48:48 jer mu je to id. Čak i ako okinem komandu tipa
docker exec container-id id apache dobijem da je uid 48.

Kad sam to promenio, uspeo sam da zavrsim instalaciju wp i snimim wp-config.php

Što se tiče tvog primera za postgres, tako sam za mysql dodao volume da bude na eksternom disku, pa prilikom startovanja mysql kontejnera mysql je spustio tu fajlove čiji se ownership sa hosta vidi kao 509 ili tako neki uid.

Na kraju...

Poenta je da postavim osnovni setup dva kontejnera, jedan apache+php drugi mysql i da vidim kako sa jenkinsom da napravim CI/CD pipeline da prilikom svakog commit-a na github se azurira i taj WP.

Nisam hteo da pitam za pomoc kako da postavim taj pipeline, to sam trebao sledece da se snadjem, nego sam zakucao sa ovim permisijama misleći da je to nešto što što se često radi, ali ne izguglah jednostavno rešenje osim da pravim script koji će da da pokrene taj docker-composer, a posl toga docker exec sa da promenim permisije... što mu dođe kao da sam ručno sam uradio...


A koliko vidim... sveukupno po vašem pisanju krećem se u pogrešnom smeru.


sry za typo, kucam sa tel

edt:

imajte na umu da sam do sada samo čitao o docker-u i danas sam prvi put startovao te kontejnere, napisao dockerfile i taj docker-compose.yml.

Tako da mi je znanje jako skromno i "od drveta ne vidim šumu"
Slično i za CI/CD koji sam do sada postavio samo jednom na virtualkama

[Ovu poruku je menjao CoyoteKG dana 06.05.2019. u 21:13 GMT+1]
[ CoyoteKG @ 08.05.2019. 09:49 ] @
Rešio sam.

Nisam pokrenuo docker-compose u detached modu i video u logu (nisam se setio ranije da može biti korisno :) )
"wp_1 exited with code 0"

To nije greška zato sa komandom "docker logs container-id" nisam našao nikakav info.

Koliko sam kasnije guglajući razumeo, docker kad je neaktivan on se stopira. U ovom slučaju ni jedan proces nije bio trajno pokrenut.
Chown komanda je izvršena uspešno i to je to. Nema više aktivnih procesa posle toga pa se kontejner isključi i startuje ponovo zbog "restart: always" i tako u krug...

Rešio sam tako što sam posle chown komande pokrenuo ponovo httpd pa compose fajl izgleda ovako
Citat:
---
version: '3.3'
services:
db:
image: mysql:5.7
ports:
- "3306:3306"
volumes:
- /docker-volumes/mysql:/var/lib/mysql
restart: always
environment:
MYSQL_ROOT_PASSWORD: pass
MYSQL_DATABASE: wpdb
MYSQL_USER: wpuser
MYSQL_PASSWORD: pass1

wp:
depends_on:
- db
image: apache-php
ports:
- "80:80"
volumes:
- /docker-volumes/wp:/var/www/html
command: >
bash -c "chown -R apache:apache /var/www/html/
&& /usr/sbin/httpd -DFOREGROUND"

restart: always

E sad ono što mi i dalje nije jasno, zašto nije startovana i komanda koju sam naveo u docker image, i dodatno ova iz docker-compose, nego se izvrši samo ta poslednja.


Sad ovako izgledaju procesi.
# docker top f67ace29df2a
UID PID PPID C STIME TTY TIME CMD
root 13721 13703 0 10:31 ? 00:00:00 bash -c chown -R apache:apache /var/www/html/ && /usr/sbin/httpd -DFOREGROUND
root 13781 13721 0 10:31 ? 00:00:00 /usr/sbin/httpd -DFOREGROUND
48 13785 13781 0 10:31 ? 00:00:00 /usr/sbin/httpd -DFOREGROUND
48 13786 13781 0 10:31 ? 00:00:00 /usr/sbin/httpd -DFOREGROUND
48 13787 13781 0 10:31 ? 00:00:00 /usr/sbin/httpd -DFOREGROUND
48 13788 13781 0 10:31 ? 00:00:00 /usr/sbin/httpd -DFOREGROUND
48 13789 13781 0 10:31 ? 00:00:00 /usr/sbin/httpd -DFOREGROUND
48 13798 13781 0 10:31 ? 00:00:00 /usr/sbin/httpd -DFOREGROUND
48 13805 13781 0 10:32 ? 00:00:00 /usr/sbin/httpd -DFOREGROUND
[ djoka_l @ 08.05.2019. 10:36 ] @
Pošto si u DOCKER fajlu koristio CMD za startovanje httpd, to predstavlja za docker default komandu za startovanje kontejnera.
Dodavanjem chown, ti si dokeru rekao da ne iszvrši default komandu nego tvoju, koju si zadao i zato nije pokrenuo apache.

Sa ENTRYPOINT bi se uvek izvršila komanda koja je tu zadata. Uglavnom, ljudi masovno koriste ENTRYPOINT umesto CMD, ali najčešće tako što je ENTRYPOINT neki shell skript u kontejneru, kako bi to moglo da se dinamički promeni, bez potreba da se ponovo bilduje kontejner.
[ CoyoteKG @ 08.05.2019. 10:46 ] @
jasno, hvala :)