# 🐳 Dockerfile ## ΠžΡΠΎΠ±Π΅Π½Π½ΠΎΡΡ‚ΠΈ - **Π‘Π°Π·ΠΎΠ²Ρ‹ΠΉ ΠΎΠ±Ρ€Π°Π·:** Ubuntu 22.04 (настраиваСтся Ρ‡Π΅Ρ€Π΅Π· ARG) - **ΠŸΡ€Π΅Π΄ΡƒΡΡ‚Π°Π½ΠΎΠ²Π»Π΅Π½Π½Ρ‹Π΅ ΡƒΡ‚ΠΈΠ»ΠΈΡ‚Ρ‹:** curl, wget, nano, mc, net-tools, ping ΠΈ Π΄Ρ€. - **ΠžΠΏΡ‚ΠΈΠΌΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ Ρ€Π°Π·ΠΌΠ΅Ρ€:** ΡƒΠ΄Π°Π»Π΅Π½ΠΈΠ΅ кэша apt послС установки - **Π‘Π΅Π·ΠΎΠΏΠ°ΡΠ½ΠΎΡΡ‚ΡŒ:** Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ создания Π½Π΅ΠΏΡ€ΠΈΠ²ΠΈΠ»Π΅Π³ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠ³ΠΎ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ - **Π“ΠΈΠ±ΠΊΠΎΡΡ‚ΡŒ:** Π»Π΅Π³ΠΊΠΎ Ρ€Π°ΡΡˆΠΈΡ€ΡΠ΅Ρ‚ΡΡ ΠΏΠΎΠ΄ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Ρ‹Π΅ Π½ΡƒΠΆΠ΄Ρ‹ ## ИспользованиС ```bash # Π‘Π±ΠΎΡ€ΠΊΠ° с Π±Π°Π·ΠΎΠ²Ρ‹ΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ Ubuntu 22.04 make docker build IMAGE=myapp TAG=latest # Π‘Π±ΠΎΡ€ΠΊΠ° с Π΄Ρ€ΡƒΠ³ΠΈΠΌ Π±Π°Π·ΠΎΠ²Ρ‹ΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ make docker build IMAGE=myapp TAG=latest BUILD_ARGS="--build-arg BASE_IMAGE=ubuntu:20.04" # Π‘Π±ΠΎΡ€ΠΊΠ° Π±Π΅Π· кэша make docker build IMAGE=myapp TAG=latest NO_CACHE=1 ``` ## Π‘Ρ‚Ρ€ΡƒΠΊΡ‚ΡƒΡ€Π° Dockerfile ```dockerfile # Π‘Π°Π·ΠΎΠ²Ρ‹ΠΉ ΠΎΠ±Ρ€Π°Π· (настраиваСтся) ARG BASE_IMAGE=ubuntu:22.04 FROM ${BASE_IMAGE} # ΠœΠ΅Ρ‚Π°Π΄Π°Π½Π½Ρ‹Π΅ LABEL maintainer="Sergey Antropov " # Настройки окруТСния ENV DEBIAN_FRONTEND=noninteractive ENV TZ=Etc/UTC ENV LANG=C.UTF-8 # Установка ΡƒΡ‚ΠΈΠ»ΠΈΡ‚ RUN apt-get update && apt-get install -y \ ca-certificates curl wget bash tzdata \ nano mc tar gzip unzip net-tools \ iputils-ping && \ apt-get clean && \ rm -rf /var/lib/apt/lists/* # Рабочая дирСктория WORKDIR /app ``` ## Π Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΠ΅ Dockerfile ### Π”ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ ```dockerfile # Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ Π½Π΅ΠΏΡ€ΠΈΠ²ΠΈΠ»Π΅Π³ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠ³ΠΎ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ RUN useradd -ms /bin/bash appuser && \ chown -R appuser:appuser /app USER appuser ``` ### Π”ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ ΠΏΠΎΡ€Ρ‚ΠΎΠ² ```dockerfile # ΠžΡ‚ΠΊΡ€Ρ‹Ρ‚ΠΈΠ΅ ΠΏΠΎΡ€Ρ‚ΠΎΠ² EXPOSE 8080 EXPOSE 3000 ``` ### Π”ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… окруТСния ```dockerfile # ΠŸΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ для прилоТСния ENV APP_HOME=/app ENV PATH="$PATH:/app/bin" ENV NODE_ENV=production ``` ### Π”ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ ```dockerfile # Команда ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ CMD ["bash"] # ΠΈΠ»ΠΈ CMD ["npm", "start"] ``` ## ΠŸΡ€ΠΈΠΌΠ΅Ρ€Ρ‹ использования ### Π‘Π°Π·ΠΎΠ²ΠΎΠ΅ использованиС ```bash # ΠŸΡ€ΠΎΡΡ‚Π°Ρ сборка make docker build IMAGE=myapp TAG=latest # Π‘Π±ΠΎΡ€ΠΊΠ° с ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΎΠΉ make docker build IMAGE=myapp TAG=v1.0.0 make docker check RUN_CMD="lsb_release -a" ``` ### Π‘Π±ΠΎΡ€ΠΊΠ° с Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π°ΠΌΠΈ ```bash # ΠŸΠ΅Ρ€Π΅Π΄Π°Ρ‡Π° ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… Π² Dockerfile make docker build \ IMAGE=myapp \ TAG=v1.0.0 \ BUILD_ARGS="--build-arg VERSION=1.0.0 --build-arg NODE_ENV=production" ``` ### Π‘Π±ΠΎΡ€ΠΊΠ° с Ρ„Π°ΠΉΠ»ΠΎΠΌ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ² ```bash # Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ Ρ„Π°ΠΉΠ»Π° build.args cat > build.args << EOF VERSION=1.0.0 BUILD_DATE=2024-01-15 NODE_ENV=production EOF # Π‘Π±ΠΎΡ€ΠΊΠ° с Ρ„Π°ΠΉΠ»ΠΎΠΌ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ² make docker build IMAGE=myapp TAG=v1.0.0 ARG_FILE=build.args ``` ## ΠžΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΡ Dockerfile ### ΠœΠ½ΠΎΠ³ΠΎΡΡ‚Π°ΠΏΠ½Π°Ρ сборка ```dockerfile # Build stage FROM node:18-alpine AS builder WORKDIR /app COPY package*.json ./ RUN npm ci --only=production # Production stage FROM node:18-alpine AS production WORKDIR /app COPY --from=builder /app/node_modules ./node_modules COPY . . CMD ["npm", "start"] ``` ### ИспользованиС .dockerignore ```dockerfile # .dockerignore node_modules npm-debug.log .git .gitignore README.md .env .nyc_output coverage ``` ### ΠœΠΈΠ½ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΡ слоСв ```dockerfile # ΠŸΠ»ΠΎΡ…ΠΎ - ΠΌΠ½ΠΎΠ³ΠΎ слоСв RUN apt-get update RUN apt-get install -y curl RUN apt-get install -y wget RUN apt-get clean # Π₯ΠΎΡ€ΠΎΡˆΠΎ - ΠΎΠ΄ΠΈΠ½ слой RUN apt-get update && \ apt-get install -y curl wget && \ apt-get clean && \ rm -rf /var/lib/apt/lists/* ``` ## Π‘Π΅Π·ΠΎΠΏΠ°ΡΠ½ΠΎΡΡ‚ΡŒ ### ИспользованиС Π½Π΅ΠΏΡ€ΠΈΠ²ΠΈΠ»Π΅Π³ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠ³ΠΎ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ ```dockerfile # Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ RUN useradd -ms /bin/bash appuser USER appuser ``` ### Π‘ΠΊΠ°Π½ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ уязвимостСй ```bash # ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° уязвимостСй docker run --rm -v /var/run/docker.sock:/var/run/docker.sock \ aquasec/trivy image myapp:latest # ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° с Π΄Π΅Ρ‚Π°Π»ΡŒΠ½Ρ‹ΠΌ ΠΎΡ‚Ρ‡Π΅Ρ‚ΠΎΠΌ docker run --rm -v /var/run/docker.sock:/var/run/docker.sock \ aquasec/trivy image --severity HIGH,CRITICAL myapp:latest ``` ### ОбновлСниС ΠΏΠ°ΠΊΠ΅Ρ‚ΠΎΠ² ```dockerfile # ОбновлСниС всСх ΠΏΠ°ΠΊΠ΅Ρ‚ΠΎΠ² RUN apt-get update && \ apt-get upgrade -y && \ apt-get clean && \ rm -rf /var/lib/apt/lists/* ``` ## ΠžΡ‚Π»Π°Π΄ΠΊΠ° ### ΠŸΡ€ΠΎΡΠΌΠΎΡ‚Ρ€ истории сборки ```bash # Π˜ΡΡ‚ΠΎΡ€ΠΈΡ слоСв docker history myapp:latest # Π”Π΅Ρ‚Π°Π»ΡŒΠ½Π°Ρ информация docker image inspect myapp:latest ``` ### Π˜Π½Ρ‚Π΅Ρ€Π°ΠΊΡ‚ΠΈΠ²Π½Π°Ρ ΠΎΡ‚Π»Π°Π΄ΠΊΠ° ```bash # Запуск ΠΈΠ½Ρ‚Π΅Ρ€Π°ΠΊΡ‚ΠΈΠ²Π½ΠΎΠ³ΠΎ ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π° docker run -it --rm myapp:latest /bin/bash # Запуск с ΠΎΡ‚Π»Π°Π΄ΠΊΠΎΠΉ docker run -it --rm \ -p 8080:8080 \ -e DEBUG=1 \ myapp:latest ``` ### Анализ Ρ€Π°Π·ΠΌΠ΅Ρ€Π° ΠΎΠ±Ρ€Π°Π·Π° ```bash # Анализ слоСв docker run --rm -it \ -v /var/run/docker.sock:/var/run/docker.sock \ wagoodman/dive:latest myapp:latest ```