Cum să creați propria imagine Docker Redmine personalizată.

Redmine înainte de personalizare
Notă: Redmine nativ docker poate fi găsit la adresa https://hub.docker.com/_/redmine. Aici puteți găsi, de asemenea, instrucțiuni bune despre cum să populați o bază de date externă și să montați foldere externe (pentru a putea instala plugin-uri).
Dacă sunteți ca mine și preferați să vedeți direct codul pentru construirea unei imagini Docker Redmine personalizate, puteți merge la github.com/lcofre/redmine și verificați Dockerfile-ul.
Imaginea Docker Redmine este un punct de pornire bun, deși probabil că doriți să o personalizați cu plugin-uri și teme după preferințele dvs. În acest ghid, vom construi o imagine Docker bazată pe cea oficială, adăugăm câteva teme și plugin-uri și o încărcăm în registrul Docker.
Pentru simplitate, nu vom utiliza o bază de date externă, ci o bază de date internă în containerul Redmine însuși. Pentru un mediu de producție, este recomandabil să configurați un container de stocare dedicat.
Plugin-uri și teme
Am ales câteva plugin-uri și teme pentru a ilustra moduri variate de a le adăuga la Redmine:
- Ascunde bara laterală, un plugin pentru a permite mai mult spațiu pe ecran, în special atunci când se scriu probleme
- Lipește din clipboard, pentru a atașa capturi de ecran lipind din clipboard în loc să selectați un fișier
- A1 și Gitmike, două teme pentru a schimba aspectul UI-ului
Excludem plugin-urile care necesită o migrare a bazei de date, deoarece aveți nevoie de o bază de date preexistentă. Vă rugăm să comentați mai jos dacă aveți nevoie să instalați un plugin care necesită migrări, deoarece avem idei bune pentru dvs.
Scrierea Dockerfile-ului
Un Dockerfile este o rețetă despre cum să construiți o imagine Docker. Prima informație pe care o vom învăța aici este că trebuie să ne bazăm imaginea pe o altă imagine, deci vom folosi cea oficială pentru Redmine
FROM Redmine
Această primă linie a Dockerfile-ului va baza sau imaginea noastră pe cea mai recentă și cea mai bună imagine, 4.1.0 în momentul scrierii. Deoarece acest lucru va lua orice versiune este cea mai recentă, este posibil să preferați să utilizați o versiune specifică pentru a evita versiuni noi neașteptate care pot strica construirea acestei imagini
FROM Redmine:4.1.0
Folosind Git pentru a obține componente
În majoritatea cazurilor, temele și plugin-urile au depozite Git de unde putem descărca cel mai recent cod. Acesta este cazul pentru următoarele trei componente.
Imaginea de bază Redmine vine fără Git, dar îl putem adăuga la imagine în felul următor:
RUN apt install -y git
Aceasta va fi executată atunci când imaginea este construită și vă va permite să utilizați Git în instrucțiunile următoare.
Tema Gitmike: aceștia recomandă clonarea repo-ului lor direct
RUN git clone https://github.com/makotokw/redmine-theme-gitmike.git public/themes/gitmike
Linia va salva proiectul clonat în folderul corespunzător public/themes
Ascunde bara laterală: Aceeași procedură poate fi aplicată și plugin-urilor. Acesta nu necesită decât plasarea folderului clonat în folderul plugin-urilor
RUN git clone https://gitlab.com/bdemirkir/sidebar_hide.git plugins/sidebar_hide
Lipirea imaginii din clipboard: Acesta pare, de asemenea, a fi procedura tipică, clonarea repo-ului și sunteți gata să mergeți
RUN git clone https://github.com/RubyClickAP/clipboard_image_paste.git plugins/clipboard_image_paste
Dar dacă citiți puțin mai mult, veți vedea că "se recomandă instalarea gem-ului RMagick, altfel imaginile atașate nu vor fi afișate în fișierele PDF exportate". Deci, cum facem asta? Ar trebui să fie la fel de ușor ca
RUN gem install rmagick
Dar probabil știți că gem-ul trebuie construit înainte de a putea fi instalat, deci trebuie să instalați unele pachete înainte de a instala gem-ul. Linia de care aveți nevoie este
RUN apt install -y build-essential imagemagick libmagickcore-dev libmagickwand-dev ruby-dev \
&& gem install rmagick
Toate într-o singură comandă, separate în două linii pentru lizibilitate.
Autorul original al acestui plugin nu oferă o versiune pentru Redmine 4, dar o căutare a numelui plugin-ului în GitHub m-a dus la un proiect care o face: RubyClickAP/clipboard_image_paste.
Adăugarea unui plugin sau temă dintr-o sursă descărcată
Tema A1 este un bun exemplu pentru a ilustra cazurile în care aveți sursa, dar nu și un URL pentru a descărca în timpul procesului de construire. O opțiune în astfel de cazuri este de a furniza sursa procesului de construire. Astfel, conținutul este adăugat la imagine fără a fi descărcat
COPY a1 public/themes/a1
Aceasta necesită ca folderul a1 să fie în același loc cu fișierul Dockerfile.
Acum sunteți pregătit să construiți imaginea, deci deschideți un terminal unde se află fișierul Dockerfile și executați
docker build -t my-redmine .
După construire, veți putea rula imaginea cu
docker run -it -p 3000:3000 --name my-redmine my-redmine
Accesați http://localhost:3000 pentru a vedea Redmine-ul personalizat!
Redmine după personalizare
Câteva sfaturi pentru a adăuga mai multe plugin-uri
Pentru a încerca plugin-uri noi, este întotdeauna mai bine să utilizați un container Redmine proaspăt. Așa am realizat că rmagick necesită instalarea unor pachete. Mai întâi, rulați o instanță eliminabilă de Redmine cu
docker run --rm -d -p 3000:3000 --name test-redmine redmine
și apoi intrați în instanță cu
docker exec -it test-redmine bash
Acolo puteți instala pachetele OS, gem-uri sau rula migrații. Doar amintiți-vă pașii astfel încât să le puteți adăuga la fișierul Dockerfile!
Încărcarea imaginii personalizate în Docker Hub
Imaginea pe care tocmai ați construit-o este disponibilă doar în mediul local. Ce se întâmplă dacă doriți să o faceți disponibilă și altora, să spunem tuturor? Desigur, puteți încărca Dockerfile și fișierele aferente într-un repo git, iar cei interesați pot construi imaginea singuri. Dar Docker vă permite, de asemenea, să încărcați imaginea construită în registrul lor. Pentru asta, creați un cont în hub.docker.com și creați, de asemenea, un depozit pentru imaginea dvs. Apoi, conectați-vă în terminal astfel:
docker login
Etichetați imaginea astfel încât să poată fi încărcată în depozitul dvs.
docker tag my-redmine:latest lcofre/redmine:latest
și încărcați-o astfel
docker push lcofre/redmine:latest
Imaginea Docker în registrul Docker
Acum oricine poate încerca imaginea dvs. făcând
docker run -it -p 3000:3000 --name my-redmine lcofre/redmine
Atât! Așa se trece de la o instalare standard Redmine la o versiune personalizată accesibilă în registrul Docker. Vă rugăm să împărtășiți comentariile sau întrebările dvs. mai jos.
Reducerea dimensiunii imaginii Docker
Veți constata că Dockerfile din repo a unit multe linii într-una singură. Aceasta este o recomandare Docker pentru a face imagini mai mici. Puteți găsi acest sfat și altele în https://docs.docker.com/develop/develop-images/dockerfile_best-practices/
O altă recomandare pentru a reduce dimensiunea finală a imaginii este de a utiliza versiunea alpine a Redmine
FROM Redmine:alpine
Alpine este o distribuție Linux diferită. În loc să utilizați apt pentru a instala pachete, trebuie să utilizați apk.
Un ultim sfat: pachetele pe care le-am instalat cu apt în Dockerfile nu mai sunt necesare după ce imaginea este construită. Puteți urma cea mai bună practică de a utiliza construcții cu mai multe etape: https://docs.docker.com/develop/develop-images/dockerfile_best-practices/#use-multi-stage-builds
Practica de a menține o imagine Docker de dimensiuni mici ajută în special atunci când se mărește numărul de instanțe, dar reduce și suprafața de atac a imaginii dvs.

Actualizarea finală Redmine? Ușoară.
Obțineți toate instrumentele puternice pentru planificarea, gestionarea și controlul perfect al proiectelor într-un singur software.