26.7.8 - æŽæ°(å®éæžããã³ãŒã远å )
ãâ£å®éã«æžããDockerfileâŠãã»ã¯ã·ã§ã³åç §)
ã¯ããã«ð³
ç©æµçŸå Žã§7幎åãçŸåœ¹ãã©ãã¯ãã©ã€ããŒããç¬åŠã§PythonãåŠã³Webãšã³ãžãã¢ãžã®è»¢èº«ãç®æããŠããŸãã
ããã¹ãã¯äžå䜿çšãããAIãšã®å¯Ÿè©±ã®ã¿ã§Flaskã¢ããªã2æ¬éçºïŒ"ðïžPuoppo"ã»"ð¥ªsales_data_app"ïŒã
ç¬åŠ105æéç®ã§èªåãäœã£ãã·ã¹ãã 2ã€ãDockeråããç°å¢ã«å·Šå³ããã誰ã«ã§ãå
±æã§ããç¶æ
ã«ãã話ãã·ã§ã¢ããŸããâ»6/30æç¹
â ãªãDockeråããã
ååã®èšäºã§ãèªåã®Flaskã³ãŒãã®ãç©èŒãã¹ãã9ã€èŠã€ããŠçŽããã
ãã ããã³ãŒãããæœ°ããŠãå€ãªããŒã¿ãæ¥ãŠããèšå®ãæŒããŠããŠããã·ã¹ãã ãèªåã§èªåãå®ãããã«ãªã£ãã
ããã§ãäžã€ã ããæåŸãŸã§æ®ã£ãŠãã課é¡ãããã
ãèªåã®PCã§ããåããªãããšããåé¡ã ã
Pythonã®ããŒãžã§ã³éããPostgreSQLã®æ¥ç¶èšå®ã®ãºã¬ãå¥ã®ç°å¢ã«æã£ãŠãã£ãç¬éã«ãèªåã®PCã§ã¯åããã®ã«ããšãããã©ãã«ãèµ·ããã
ãããçµå±ããã ããé転ã®éããšåãæ§é ã ã£ãã
ããã®ç°å¢ã§ãåãã ãããããäžçªå±ãªãã
â¡Dockerãšã¯ïŒð³
Dockerãäœãªã®ããæåã¯ãã³ãšæ¥ãªãã£ããç©æµç®ç·ã§ãé£ãããã§ãçè ã®è¶£å³ã®äŸã§èãããè ¹ã«èœã¡ãã
2-1. ðïžããåé§ã®ãåå¿è
ã»ãããð
åå¿è
ã»ããã¯ãã·ã£ãŒã·ã»ã¢ãŒã¿ãŒã»ã®ã¢ã»ã¿ã€ã€ãå
šéš1ç®±ã«æã£ãŠããã誰ãè²·ã£ãŠããåãããŒããåãçµã¿åããã§æå
ã«æ¥ãã
ããã«åãããŠé»æ± ããžã¥ãã¢ãµãŒããããå ããã°ããŸãã«Dockerãã®ãã®ã ã
2-2. ð±ã³ã³ããå
¥ãã®å·åé£åðœïž
å·åé£åã¯ã容åšã®äžã«å
·æãèª¿å³æãå
šéšå
¥ã£ãŠãããã¬ã³ãžã§æž©ããã ãã§ã誰ããã£ãŠãåãå³ãåçŸã§ããã
Dockerãåãã ã Pythonã»Flaskã»PostgreSQLã»å¿ èŠãªã©ã€ãã©ãªã1ã€ã®ã³ã³ããã«äžžããšè©°ããã ã³ãã³ã1ã€ã§ãèª°ã®æå ã§ãå šãåãç°å¢ãç«ã¡äžããã
ãèªåã®PCå°çšã®ã·ã¹ãã ã ãã**ãã©ãã«ã§ãåºè·ã§ãããã仿§ã®ãããã¯ãã** ãžã
â¢å®éã«ãã£ãŠã¿ãããæåæãããã»ã©ã¹ã ãŒãºã ã£ã
身æ§ããŠããã
Dockeråã¯æªçµéšãã絶察ã©ããã§ãããã ãšæã£ãŠããã
ãšããããå®éã«ãã£ãŠã¿ããšè©°ãŸãå Žæãã»ãšãã©ãªãã£ãã
ãªããããªã«ã¹ã ãŒãºã ã£ãã®ããåŸããæ¯ãè¿ã£ãŠçç±ãèããŠã¿ãã
çç±ïŒïŒç©èŒãã¹å¯Ÿçããã®ãŸãŸå¹ãã
ååçŽãããç°å¢å€æ°ã®äºåãã§ãã¯ïŒFail-FastïŒãããDockerã³ã³ããå
ã§ããã®ãŸãŸæ©èœãããèšå®æŒããããã°èµ·åæã«å³åæ¢ããä»çµã¿ãå
ã«äœã£ãŠããããããã³ã³ããååŸãè¿·ãå Žæããªãã£ãã
çç±ïŒïŒäžèŠãªè·ç©ãå
ã«éãããŠãã
å€ãExcelåŠçã䜿ãããŠããªããã¡ã€ã«ãæ°æ§æ··åšã®ã©ã€ãã©ãªãååã®èŠçŽãã§ããããå
šéšåé€ããŠãããããã³ã³ããã«ç©ã¿èŸŒãè·ç©èªäœãæåããå°ãªãã£ããç©ãåã®æŽçããã®ãŸãŸå¹ããã
çç±ïŒïŒãã ããããæ¶ãçãã€ããŠãã
ãåãã ãããã§é²ãããäžã€ã²ãšã€ãæ¬åœã«ãã®èšå®ã§åãããã確èªããªããç©ã¿äžãããçŸå Žã®ããããããªãé転ãããã®ãŸãŸäœæ¥ã®é²ãæ¹ã«ãªã£ãŠããã
身æ§ããŠããã»ã©å€§ããªå£ã¯æ¥ãªãã£ããå°å³ãªç©ã¿éãããã¡ãããšå¹ããŠãããšããããšã ãšæãã
â£å®éã«æžããDockerfileãšdocker-compose.yml
ãæåæãããã»ã©ã¹ã ãŒãºã ã£ãããšèšã£ãŠãããããè£ä»ããäžèº«ããªããšèª¬åŸåã«æ¬ ããã
å®éã«æžããã³ãŒãã眮ããŠããã
4-1.sales_data_appã®Dockerfile
# 1. ããŒã¹ãšãªãç°å¢ã« Python 3.12 ãæå®ïŒè»œé㪠slim çãæ¡çšããŠãªãœãŒã¹ãæé©åïŒ
FROM python:3.12-slim
# 2. ã³ã³ããå
ã®äœæ¥ãã£ã¬ã¯ããªïŒéšå±ïŒã決ãã
WORKDIR /app
# 3. äŸåã©ã€ãã©ãªã®ãªã¹ããå
ã«ã³ã³ããå
ã«ã³ããŒ
COPY requirements.txt .
# 4. ã³ã³ããå
ã§ pip ã€ã³ã¹ããŒã«ãå®è¡ïŒãã£ãã·ã¥ã䜿ãã軜éåïŒ
RUN pip install --no-cache-dir -r requirements.txt
# 5. ã¢ããªã®å
šãã¡ã€ã«ãã³ã³ããå
ã«ã³ããŒ
COPY . .
# 6. Flaskãå€éšããã®æ¥ç¶ãåãä»ããããããã«ããŒã5000ãéæŸ
EXPOSE 5000
# 7. ã³ã³ããèµ·åæã« Flask ã¢ããªãå®è¡ããã³ãã³ã
CMD ["python", "app.py"]
4-2.puoppoã®Dockerfile
FROM python:3.11-slim
WORKDIR /app
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
COPY . .
EXPOSE 5000
CMD ["python", "app.py"]
èŠæ¯ã¹ããšåããéããéãã®ã¯ããŒã¹ã€ã¡ãŒãžã®PythonããŒãžã§ã³ã ããããšã®æ§é ã¯äžžããšäœ¿ãåããã
ãäžåºŠåãäœãã°ã2æ¬ç®ã¯ç¥èã®äœ¿ãåãã§äžæ°ã«çµããããšããã®ã¯ããã®2ã€ã䞊ã¹ãŠåããŠäŒãã話ã ãšæãã
4-3.DBæ¥ç¶ãŸããïŒsales_data_appã®docker-compose.yml
sales_data_appã¯PostgreSQLã䜿ã£ãŠããã®ã§ãDockerfileåäœã§ã¯å®çµããªããDBçšã®ã³ã³ãããå¥ã«ç«ãŠãŠç¹ãå¿ èŠããã£ãã
services:
web:
build: .
ports:
- "5000:5000"
env_file:
- .env
environment:
- DATABASE_URL=postgresql://postgres:postgres@db:5432/sales_db
volumes:
- ./:/app
depends_on:
db:
condition: service_healthy
db:
image: postgres:16
environment:
- POSTGRES_USER=postgres
- POSTGRES_PASSWORD=postgres
- POSTGRES_DB=sales_db
volumes:
- postgres_data:/var/lib/postgresql/data
healthcheck:
test: ["CMD-SHELL", "pg_isready -U postgres"]
interval: 5s
timeout: 5s
retries: 5
volumes:
postgres_data:
ããã§äžçªå¹ããã®ã¯ depends_on ã® condition: service_healthy ã ãšæã£ãŠããã
æ®éã«depends_on: dbãšã ãæžããšããdbã³ã³ãããèµ·åãå§ãããæç¹ã§webã³ã³ãããæ¥ç¶ããã«ãã£ãŠããŸããPostgreSQLåŽã®æºåãéã«åããã«ãšã©ãŒã«ãªãããšãããã
healthcheckã§pg_isreadyãåŸ
ã£ãŠããèµ·åãã圢ã«ããããšã§ã**ãDBã®æºåãã§ããŠããæ¥ç¶ããã**ãšããé åºãä¿èšŒã§ããã
ããã¯ååã®èšäºã§çŽãããç°å¢å€æ°ã®Fail-Fastãã§ãã¯ããšåãçºæ³ã ãšæããã³ãŒãåŽã ãã§ãªããã³ã³ããã®èµ·åé åºã«ããã ããããæ®ããªãããããŸã§ãã£ãŠåããŠãç°å¢å·®ã®ãã©ãã«ããè§£æŸãããã
4-4.å®è¡ã³ãã³ãïŒ2ã€ã®ã¢ããªã§æé ãéã£ãçç±
åããDockeråãã§ããsales_data_appãšpuoppoã§ã¯å®è¡ã³ãã³ããéããçç±ã¯DBæ§æã®éãã«ããã
sales_data_appïŒPostgreSQLãšé£æºãããããè€æ°ã³ã³ãããå¿ èŠïŒ
docker compose up --build
ãã®ã³ãã³ã1ã€ã§ãwebã»db2ã€ã®ã³ã³ãããåæã«ç«ã¡äžãããdocker-compose.ymlã«å®çŸ©ããæ§æããŸãšããŠè§£éããŠãããã®ã§ãè€æ°ã³ã³ããã®èµ·åé åºããããã¯ãŒã¯æ¥ç¶ãåå¥ã«æå®ããå¿ èŠããªãã
puoppoïŒSQLiteã®ã¿ã§å®çµãããããåäœã³ã³ããã§ååïŒ
docker build -t puoppo-app .
docker run -p 5000:5000 --env-file .env puoppo-app
puoppoã¯å€éšã®DBã³ã³ãããšç¹ãå¿
èŠããªããããdocker-compose.ymlãäœãããbuildârunã®2ã¹ãããã§æžãã ã
æ§æãéãã°ãå¿
èŠãªã³ãã³ããå€ããã
DBãè€æ°ã³ã³ããã§é£æºãããããåäœã§å®çµããããããã®èšèšå€æãããã®ãŸãŸã³ãã³ãã®æ°ã«è¡šãã圢ã«ãªãã
â€ããäžæ¬ã®ã¢ããªããåãèŠé ã§Dockeråãã
sales_data_app ã®Dockeråã¯åããŠã ã£ãã®ã§ 3æé ããã£ãããåãèŠé ã§ puoppo ãDockeråããã 1æé ã§å®äºããã
READMEã«äœé𿹿³ãèšèŒããŠããã®ã§ãæ°ã«ãªãæ¹ã¯ãã¡ããã©ããã
ð¥ªsales_data_appã®GitHubã¯ãã¡ãð
ðïžpuoppo_appã®GitHubã¯ãã¡ãð
äžåºŠåãäœãã°ã2æ¬ç®ã¯ç¥èã®äœ¿ãåãã§äžæ°ã«çµãããåçŸæ§ãåºããšããããšã ãšæãã
â¥çŽããŠå€ãã£ãããš
ãèªåã®PCã§ããåããªãã ãæ¶ããã
ã³ãã³ã1ã€ã§ãèª°ã®æå
ã§ãåãç°å¢ãç«ã¡äžããã
Pythonã®ããŒãžã§ã³å·®ãã©ã€ãã©ãªã®å
¥ãå¿ããèšå®æŒããç°å¢å·®ã§èµ·ãããã©ãã«ããè§£æŸãããã
ãåãã°ãšã·ïŒâïžããã
ã誰ã®ç°å¢ã§ãåãããã«åãð³ããžã
âŠæ¬¡ã«ããããš
ç°å¢å·®ã¯ç¡ããªã£ããã§ããããã¯ãDockerãåãã人ããåçŸã§ããç¶æ
ã«éããªãã
READMEã«æé ãæžããŠããcloneããŠãã«ãããŠâŠãšããå·¥çšãèžãã人ã«ãããçµå±ã¢ããªã¯å±ããªãã
次ã®èª²é¡ã¯ãURLãã¯ãªãã¯ããã ãã§ ãåãããªã人ãã§ãè§Šããç¶æ
ãäœãããšã ãšæã£ãŠããã
æ¬çªãããã€ãå°æ¥çã«ã¯CI/CDãèŠéã«ããããæ¬¡ã®ã¹ãããã«ãªãã
sales_data_app æŽåèšé²ã·ãªãŒãº
ãæ¬çªåºèµ°åã»è»æ€äžéšäœã
ðãåºèµ°åŸã¡ã³ããã³ã¹ã·ãªãŒãºã
ð





