{"id":23084974,"url":"https://github.com/asdil1/docker-lab","last_synced_at":"2026-05-03T15:35:58.865Z","repository":{"id":265105235,"uuid":"895108478","full_name":"asdil1/docker-lab","owner":"asdil1","description":null,"archived":false,"fork":false,"pushed_at":"2024-11-28T09:42:41.000Z","size":137,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-10-05T18:41:21.616Z","etag":null,"topics":["docker","docker-compose","dockerfile","nestjs-backend","postgresql","typeorm"],"latest_commit_sha":null,"homepage":"","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/asdil1.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2024-11-27T15:17:39.000Z","updated_at":"2024-11-29T16:45:44.000Z","dependencies_parsed_at":"2025-07-13T14:36:40.267Z","dependency_job_id":"e608cdc8-766b-489d-af09-a589a48c08f0","html_url":"https://github.com/asdil1/docker-lab","commit_stats":null,"previous_names":["asdil1/docker-lab"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/asdil1/docker-lab","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/asdil1%2Fdocker-lab","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/asdil1%2Fdocker-lab/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/asdil1%2Fdocker-lab/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/asdil1%2Fdocker-lab/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/asdil1","download_url":"https://codeload.github.com/asdil1/docker-lab/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/asdil1%2Fdocker-lab/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":32575113,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-03T06:36:36.687Z","status":"ssl_error","status_checked_at":"2026-05-03T06:36:09.306Z","response_time":103,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["docker","docker-compose","dockerfile","nestjs-backend","postgresql","typeorm"],"created_at":"2024-12-16T17:41:09.472Z","updated_at":"2026-05-03T15:35:58.843Z","avatar_url":"https://github.com/asdil1.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003ch1\u003eЛабораторная работа \"Docker: докеризация приложения\"\u003c/h1\u003e\n\u003ch2\u003eЗадание\u003c/h2\u003e\n\u003cp\u003e\nЦель лабораторной: собрать из исходного когда и запустить в докере рабочее приложение с базой данных (любое опенсорс - Java, python/django/flask, golang).\n\n1. Образ должен быть легковесным\n2. Использовать базовые легковесные образы - alpine\n3. Вся конфигурация приложения должна быть через переменные окружения\n4. Статика (зависимости) должна быть внешним томом `volume`\n5. Создать файл `docker-compose` для старта и сборки\n6. В `docker-compose` нужно использовать базу данных (postgresql,mysql,mongodb etc.)\n7. При старте приложения должно быть учтено выполнение автоматических миграций\n8. Контейнер должен запускаться от непривилегированного пользователя\n9. После установки всех нужных утилит, должен очищаться кеш\n\u003c/p\u003e\n\u003ch2\u003eВыполнение работы\u003c/h2\u003e\n\n**1)** Было написано приложение на NestJS, PostgreSQL подключена через TypeORM. \\\nВ приложении описан сервис для управления пользователями и определена сущность \nпользователя User для работы с бд с использованием TypeORM. \\\nТакже реализован контролер для связи маршрутов с методами сервиса.\n\n**2)** Для генерации миграций был написан файл конфигурации `typeorm.config.ts`, \nчтобы сгенерировать новую миграцию нужно использовать команду `npm run migration:generate`, \nмиграции будут сгенерированы в папке `src/migrations`. \nДля выполнения всех сгенерированных миграций нужно использовать `npm run migration:run`\n\n**3)** Dockerfile\n```\nFROM node:18-alpine\n\nRUN addgroup -S appgroup \u0026\u0026 adduser -S appuser -G appgroup\n\nWORKDIR /usr/src/app\n\nCOPY package*.json ./\n\nRUN npm install \u0026\u0026 rm -rf /tmp/*\n\nCOPY . .\n\nRUN npm run build\n\nUSER appuser\n\nEXPOSE 3000\n\nCMD [\"sh\", \"-c\", \"npm run migration:run \u0026\u0026 npm run start:prod\"]\n```\nФайл описывает процесс создания Docker-образа приложения\n- Используется базовый легковесный образ `node:18-alpine`\n- Создается группа для непривилегированного пользователя \nи в нее добавляется пользователь\n- Устанавливает рабочая директория, \nкопируются `package.json` и `package-lock.json` в контейнер, \nдалее устанавливаются все зависимости и удаляется временный кеш\n- Все файлы проекта кроме файлов указанных в `.dockerignore` копируются в рабочую директорию\n- Выполняется команда сборки приложения и переход на непривилегированного пользователя\n- Устанавливается порт для приложения\n- При запуске контейнера выполняются миграции бд и запускается приложение\n\n**4)** docker-compose.yaml\n```\nservices:\n  nest-app:\n    container_name: nest-app\n    image: asdil/nest-app:latest\n    build:\n      context: .\n    ports:\n      - \"3000:3000\"\n    environment:\n      DB_TYPE: postgres\n      PG_HOST: db\n      PG_PORT: 5432\n      PG_USERNAME: postgres\n      PG_PASSWORD: postgres\n      PG_DATABASE: postgres\n    depends_on:\n      - db\n  db:\n    container_name: db\n    image: postgres:17.2-alpine\n    ports:\n      - \"5432:5432\"\n    environment:\n      POSTGRES_USER: postgres\n      POSTGRES_PASSWORD: postgres\n      POSTGRES_DB: postgres\n    volumes:\n      - postgres_data:/var/lib/postgresql/data\nvolumes:\n  postgres_data: {}\n```\n1. В файле описана конфигурация для запуска контейнеров\n   - services - список сервисов, которые нужно запустить\n   - volumes - тома для хранения данных \n2. Сервис nest-app\n   - задается имя контейнера\n   - используется Dockerfile для сборки образа\n   - пробрасывается порт 3000 контейнера на порт 3000 хоста \n   - задаются переменные окружения для подключения к бд\n   - `depends_on` указывает, что сервис должен запускаться после старта сервиса db\n3. Сервис db\n   - задается имя контейнера\n   - используется легковесный образ PostgreSQL\n   - пробрасывается порт 5432 контейнера на порт 5432 хоста\n   - настраиваются учетные данные и имя бд через переменные окружения\n   - для хранения данных используется том postgres_data\n4. Тома volumes\n   - postgres_data - имя тома\n\n**5)** Для сборки образов выполняем команду `docker compose build`\n\n![img.png](img.png)\n\n**6)** Для запуска контейнеров выполняем команду `docker compose up -d`\n\n![img_1.png](img_1.png)\n\n**7)** Проверим с помощью Postman корректную работу\n-  Выполним POST запрос для добавления пользователя, в теле запроса укажем данные пользователя\n```\n{\n    \"username\": \"aaa\",\n    \"email\": \"aaa@gmail.com\"\n}\n```\n- Выполним GET запрос на localhost:3000/users/1\n```\n{\n  \"id\": 1,\n  \"username\": \"aaa\",\n  \"email\": \"aaa@gmail.com\"\n}\n```\n- Добавим еще нескольких пользователей и выполним запрос для получения всех пользователей\n```\n[\n    {\n        \"id\": 1,\n        \"username\": \"aaa\",\n        \"email\": \"aaa@gmail.com\"\n    },\n    {\n        \"id\": 2,\n        \"username\": \"bbb\",\n        \"email\": \"bbb@gmail.com\"\n    },\n    {\n        \"id\": 3,\n        \"username\": \"ccc\",\n        \"email\": \"ccc@gmail.com\"\n    }\n]\n```","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fasdil1%2Fdocker-lab","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fasdil1%2Fdocker-lab","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fasdil1%2Fdocker-lab/lists"}