היום למדתי: פרופילים ב docker compose
מה קורה אם אתם צריכים להפעיל גם משימה חד פעמית בפרויקט שמשתמש ב docker compose? טוב דרך אחת היא להתחבר לקונטיינר שכבר מריץ את היישום ולהפעיל את המשימה מתוכו. לדוגמה נניח שיש לי את התוכן הבא ב docker-compose.yml
:
version: "3.9"
services:
backend:
image: backend
db:
image: mysql
ויש לי סקריפט בשם myapp migrate
שאני יכול להפעיל רק מתוך האימג' של backend, אז אני יכול להעלות את הסרביסים וכשצריך להפעיל את הסקריפט:
$ docker compose up -d
$ docker compose run backend bash -c "myapp migrate"
אבל זה עקום כי אולי הפעלה של backend לוקחת הרבה זמן או שאני צריך שהסקריפט ירוץ כשהיישום שלי למטה או לפני שהיישום עולה.
הייתי מעדיף לכתוב סרביס עבור הסקריפט ב docker-compose.yml שיכלול גם את הפקודה ויאפשר להריץ את הסקריפט עם הפרמטרים שאני צריך והאימג' הרלוונטי:
version: "3.9"
services:
backend:
image: backend
db:
image: mysql
migrate:
image: backend
command: myapp migrate
אבל עכשיו יש לי בעיה חדשה - הסקריפט ירוץ כל פעם שאני כותב docker compose up
, ובשביל למנוע ממנו לרוץ אני צריך להעביר במיוחד את רשימת כל הסרביסים האחרים ל docker compose up
.
מסתבר שיש פיתרון פשוט ומובנה ב docker compose שנקרא פרופילים: אנחנו מציינים לכל סרביס לאיזה פרופיל הוא שייך. סרביסים שלא שייכים לאף פרופיל יעלו כשאני כותב docker compose up
, וסרביסים אחרים יופעלו כשאני מפעיל את הפרופיל או כשאני מפעיל אותם בצורה יזומה. במקרה של הסקריפט שלי זה אומר לעבור ל docker-compose.yml
הבא:
version: "3.9"
services:
backend:
image: backend
db:
image: mysql
migrate:
image: backend
command: myapp migrate
profiles: ["tools"]
עכשיו אני יכול להפעיל docker compose up
כדי להפעיל את המערכת הרגילה, או docker compose run migrate
כדי להפעיל את סקריפט המיגרציה.