interview / Dockerfile
Lee93whut
chore: initial project scaffold
141a818
# Dockerfile โ€” Hugging Face Spaces (Docker SDK) ไธ“็”จ
#
# ่ง„่Œƒ้ตๅฎˆ
# --------
# 1. ๆšด้œฒ็ซฏๅฃ 7860๏ผˆHF ๅ›บๅฎšๅ‰็ซฏ็ซฏๅฃ๏ผŒ็ฆๆญขไฝฟ็”จ 8501๏ผ‰
# 2. ้ž root ็”จๆˆท `user`๏ผˆUID=1000๏ผ‰๏ผŒ็ฌฆๅˆ HF ๅฎ‰ๅ…จ็ญ–็•ฅ
# 3. ๅฏๅŠจๅ‘ฝไปค๏ผšstreamlit run app.py --server.port=7860 --server.address=0.0.0.0
#
# ้•œๅƒไฝ“็งฏไผ˜ๅŒ–
# ------------
# torch CPU-only wheel (~700MB) ไปฃๆ›ฟๅฎŒๆ•ด GPU ็‰ˆๆœฌ (~3GB)
# Demo ไป…ๅšๆŽจ็†๏ผŒไธ้œ€่ฆ CUDA ๆ”ฏๆŒ
#
# ๆœฌๅœฐๆž„ๅปบๆต‹่ฏ•
# ------------
# docker build -t maze-dqn-demo .
# docker run -p 7860:7860 maze-dqn-demo
# ๆต่งˆๅ™จ่ฎฟ้—ฎ๏ผšhttp://localhost:7860
FROM python:3.10.14-slim
# โ”€โ”€ ็ณป็ปŸๅŸบ็ก€ไพ่ต– โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
RUN apt-get update && apt-get install -y --no-install-recommends \
build-essential \
git \
&& rm -rf /var/lib/apt/lists/*
# โ”€โ”€ ๅˆ›ๅปบ้ž root ็”จๆˆท๏ผˆHF ๅฎ‰ๅ…จ่ฆๆฑ‚๏ผšUID=1000๏ผ‰โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
RUN useradd -m -u 1000 user
WORKDIR /app
# โ”€โ”€ ๅ…ˆๅฎ‰่ฃ…ไพ่ต–๏ผˆๅˆฉ็”จ Docker layer cache๏ผŒไปฃ็ ๅ˜ๆ›ดไธ่งฆๅ‘้‡่ฃ…๏ผ‰โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
COPY --chown=user:user requirements.txt .
# ๅ…ˆๅ•็‹ฌๅฎ‰่ฃ… torch CPU-only wheel๏ผŒ้ฟๅ…้ป˜่ฎคๆ‹‰ๅ– GPU ็‰ˆๆœฌ๏ผˆ~3GB โ†’ ~700MB๏ผ‰
RUN pip install --no-cache-dir --upgrade pip \
&& pip install --no-cache-dir torch --index-url https://download.pytorch.org/whl/cpu \
&& pip install --no-cache-dir -r requirements.txt
# โ”€โ”€ ๆ‹ท่ดๅบ”็”จๆ ธๅฟƒๆ–‡ไปถ โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
# app.py Web ๅ‰็ซฏไธป็จ‹ๅบ
# maze_env/ Gymnasium ็ŽฏๅขƒๅŒ…๏ผˆๅซ bfs.py๏ผŒ้€š่ฟ‡ pip install ๅฎ‰่ฃ…๏ผ‰
# src/model.py ็ฅž็ป็ฝ‘็ปœๆžถๆž„๏ผˆsys.path ๆณจๅ…ฅ src/ ๅŽๅฏผๅ…ฅ๏ผ‰
# config.yaml ่ถ…ๅ‚ๆ•ฐ้…็ฝฎๆ–‡ไปถ๏ผˆapp.py ๅฏๅŠจๆ—ถ่ฏปๅ–๏ผ‰
# results/best_model_train_*.pth ๅ››็ฎ—ๆณ•่ฎญ็ปƒๆƒ้‡๏ผˆapp.py ๆŒ‰ algorithm ๅๅŠจๆ€ๅŠ ่ฝฝ๏ผ‰
# pyproject.toml ๅŒ…ๅฎ‰่ฃ…ๆ่ฟฐ็ฌฆ๏ผˆpip install -e . ้œ€่ฆ๏ผ‰
COPY --chown=user:user app.py .
COPY --chown=user:user src/model.py src/model.py
COPY --chown=user:user maze_env/ maze_env/
COPY --chown=user:user pyproject.toml .
COPY --chown=user:user config.yaml .
COPY --chown=user:user results/best_model_train_vanilla.pth results/best_model_train_vanilla.pth
COPY --chown=user:user results/best_model_train_double.pth results/best_model_train_double.pth
COPY --chown=user:user results/best_model_train_dueling.pth results/best_model_train_dueling.pth
COPY --chown=user:user results/best_model_train_double_dueling.pth results/best_model_train_double_dueling.pth
# โ”€โ”€ ๅฎ‰่ฃ… maze_env ๅŒ…๏ผˆไฝฟ `from maze_env import ...` ็”Ÿๆ•ˆ๏ผ‰โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
RUN pip install --no-cache-dir -e .
# โ”€โ”€ ๅˆ‡ๆขๅˆฐ้ž root ็”จๆˆท โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
USER user
# โ”€โ”€ ๆšด้œฒ HF ไธ“็”จ็ซฏๅฃ โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
EXPOSE 7860
# โ”€โ”€ ๅฏๅŠจๅ‘ฝไปค๏ผˆHF ่ง„่Œƒ๏ผšport=7860, address=0.0.0.0๏ผ‰โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
CMD ["streamlit", "run", "app.py", \
"--server.port=7860", \
"--server.address=0.0.0.0", \
"--server.headless=true", \
"--server.fileWatcherType=none"]