Новое:Talanto осенью: поиск с цифрами, вакансия по шагам и каталог компаний

+661новая вакансия за сутки·58 731вакансия открыта сейчас·Новое:Talanto осенью: поиск с цифрами, вакансия по шагам и каталог компаний

Новые вакансии в TelegramРаботодателям
Talanto
Вакансии
Компании5 712
РезюмеAIПодготовкаСтатьи
ТарифыТарифы
Войти

Не нашли подходящее?

Пусть нужная вакансия найдёт вас сама.

  1. Подборка в TelegramНовые вакансии по вашему фильтру — сразу в бота.Подключить
  2. Мэтчи по резюмеЗагрузите резюме — покажем, где вы подходите лучше всего.Загрузить
  3. Сохранить фильтрНастройте поиск один раз и возвращайтесь к новым вакансиям.Настроить
Что нового на TalantoTalanto осенью: поиск с цифрами, вакансия по шагам и каталог компаний

Для работодателей

Опубликуйте вакансию — отклики придут в ваш кабинет.

  1. Вакансиябесплатно
  2. Откликиконтакты бесплатно
  3. Наймэтапы и интервью

40 компаний публикуют вакансии напрямую · 4 393 кандидата открыты к предложениям

Разместить вакансию

Популярные направления

Все подборки
  • Python11 079
  • Облачные технологии8 824
  • QA вакансии2 977
  • Android1 395
  • Инженер данных1 032
  • Продакт-менеджер351

Разработка

  • Backend вакансии1 342
  • iOS1 307
  • AI вакансии660
  • Fullstack вакансии524
  • Frontend вакансии465
  • Mobile вакансии28

По стеку

  • Go6 622
  • Java3 670
  • Kotlin1 199
  • Node.js1 190
  • Rust1 181
  • .NET780
  • PHP329
  • C++301
  • C#211

DevOps и инфраструктура

  • Kubernetes5 251
  • Linux-инфраструктура4 138
  • DevOps вакансии3 024
  • Terraform / IaC2 834
  • Мониторинг и Observability1 406
  • CI/CD917
  • SRE389
  • Кибербезопасность40

Аналитика и данные

  • Аналитик данных586
  • Бизнес-аналитик487
  • Data Scientist458
  • Системный аналитик75

Другие направления

  • Проджект-менеджер114
  • UI/UX дизайн74
  • Ручное тестирование14

По регионам

  • Вакансии в США31 201
  • Вакансии в Европе11 507
  • Работа в России3 630
  • Вакансии в Канаде2 546

По формату

  • Удалённые вакансии47 761
  • Релокация в США31 201
  • Гибридная работа7 699
  • Офисная работа6 071

По уровню

  • Senior вакансии27 027
  • Middle вакансии12 284
  • Junior вакансии4 495

Сейчас нанимают

Все компании
  • Wise196 вакансий
  • Rakuten188 вакансий
  • ASML163 вакансии
  • Grab134 вакансии
  • Celonis48 вакансий
  • Spotify38 вакансий
  • Adyen28 вакансий
  • Infobip28 вакансий
  • Monzo20 вакансий
  • Darktrace17 вакансий

Вакансии из 344 источников: карьерные страницы компаний и джоб-борды.

КомпанииО насНовостиПубличная офертаУсловия использованияПолитика конфиденциальностиПоддержка
←К подготовке по вакансии←К теме DockerВсе вопросы
DockerMiddleКодинг

Почему запускать контейнер от root — плохо? Как задать non-root user в Dockerfile?

В закладки
Сначала попробуйте ответить сами30 секунд
Сравнить с ответом ↓

Root в контейнере опасен: при уязвимости атакующий получает привилегированный доступ к хосту и volumes. Задаётся через USER 1001 в Dockerfile после создания пользователя через useradd/adduser с фиксированным UID.

Задать non-root user в Dockerfile

# Вариант 1: создать пользователя в образе
FROM python:3.13-slim

# Создаём группу и пользователя с фиксированным UID/GID
RUN groupadd --gid 1001 appgroup && \
    useradd --uid 1001 --gid appgroup --shell /bin/sh --create-home appuser

WORKDIR /app
COPY --chown=appuser:appgroup requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt

COPY --chown=appuser:appgroup . .

# Переключиться на non-root пользователя
USER appuser

EXPOSE 8000
CMD ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "8000"]
# Вариант 2: distroless образ (Google)
FROM gcr.io/distroless/python3-debian12
COPY --from=builder /app /app
WORKDIR /app
# distroless запускает от nonroot (UID 65532) по умолчанию
CMD ["main.py"]

Запуск контейнера от non-root пользователя

По умолчанию процессы в контейнере запускаются от root (UID 0). Даже если user namespace не настроен, root внутри контейнера = root снаружи при определённых условиях. Это основная причина многих container escape уязвимостей.

Почему root в контейнере опасен

  • Примонтированные volumes наследуют права: файлы, созданные контейнером, принадлежат root на хосте.
  • Уязвимость в приложении даёт атакующему root-права в контейнере, что существенно упрощает побег.
  • Без User Namespace root в контейнере = root на хосте при доступе к shared ресурсам (procfs, shared volumes).
  • Многие compliance-стандарты (PCI DSS, SOC 2, CIS Docker Benchmark) запрещают root в контейнерах.

Node.js пример

FROM node:20-alpine

# node-образы уже содержат пользователя 'node' (UID 1000)
WORKDIR /app
COPY --chown=node:node package*.json .
RUN npm ci --only=production
COPY --chown=node:node . .

USER node
EXPOSE 3000
CMD ["node", "server.js"]

Go с минимальным scratch образом

FROM golang:1.22 AS builder
WORKDIR /app
COPY . .
RUN CGO_ENABLED=0 go build -o server .

FROM scratch
# В scratch нет useradd — копируем passwd файл
COPY --from=builder /etc/passwd /etc/passwd
COPY --from=builder /app/server /server
USER nobody
CMD ["/server"]

Docker Compose: проверка пользователя

services:
  api:
    image: my-api:latest
    user: "1001:1001"  # можно переопределить здесь
    # или через переменную:
    # user: "${UID}:${GID}"

Проверка

# Проверить, от кого запущен процесс
docker exec my-container whoami
docker exec my-container id

# Проверить образ без запуска
docker inspect my-image --format '{{.Config.User}}'

Capabilities вместо root

Если приложению нужны специфические привилегии (например, слушать порт <80 или управлять сетью), можно добавить конкретные capabilities вместо полного root:

docker run -d \
  --user 1001 \
  --cap-add NET_BIND_SERVICE \
  my-app:latest

Подводные камни

  • Файлы, скопированные через COPY без --chown, принадлежат root — non-root пользователь не сможет их прочитать, если права 640.
  • Монтированные volumes создаются с правами хоста. Если volume принадлежит root, контейнерный non-root пользователь не получит доступ. Решение: инициализировать volume через entrypoint или задать chown в entrypoint.sh.
  • Некоторые базовые образы (Alpine) не содержат useradd — используйте adduser -D appuser.
  • Если UID внутри контейнера не совпадает с UID владельца файла на хосте, могут возникнуть проблемы с правами при работе с bind mount.
  • USER в Dockerfile не препятствует docker run --user root ... — IMAGE-инструкция легко переопределяется при запуске.
  • Distroless-образы не содержат shell — docker exec ... bash не работает. Для отладки нужен debug-вариант: gcr.io/distroless/python3-debian12:debug.
  • Запуск от non-root не помогает, если контейнер запущен с --privileged — это полностью отключает ограничения безопасности.
  • Фиксируйте UID числом (1001), а не именем — в разных базовых образах одно имя может иметь разный UID, что приводит к непредсказуемым правам.

Типичные ошибки

  • Добавить USER, но оставить файлы приложения root-owned и получить permission denied.
  • Запускать контейнер с Docker socket mount, считая non-root достаточной защитой.
  • Использовать root ради записи в произвольные директории вместо настройки writable paths.

Что проверяет интервьюер

  • Объясняет blast radius root in container.
  • Пишет Dockerfile with user/group and ownership.
  • Учитывает volumes, ports, writable directories and capabilities.

Как вы знаете этот вопрос?

Проверить себя по теме Docker →

Источники

  • https://docs.docker.com/reference/dockerfile/
  • https://docs.docker.com/engine/
←Предыдущий вопросСценарий: два контейнера запущены, но один не может достучаться до другого по имени. Что проверяешь?Следующий вопрос→Что такое namespaces и cgroups, и при чём они тут? (На senior без этого вопроса не уходят.)

Связанные темы

DockerContainer SecurityDockerfile hardeningLinux permissions

Вакансии с этим навыком

Docker вакансии
  • Senior .Net Engineer (#5586)
  • AI Enablement Lead (GenAI Value Lab) (#5686)
  • Senior MLOps Engineer (#5860)
  • Senior Python Engineer (Embedded project) (#5821)
  • Middle AI/ML Engineer (#5827)

Частые вопросы на собеседовании

  • Как ты организуешь tagging образов в проде? Почему latest в проде — плохо?
  • Чем named volume отличается от bind mount и от tmpfs? Когда что использовать?
  • Зачем контейнер должен писать логи в stdout/stderr, а не в файл?
  • Контейнер в Restarting бесконечно. Алгоритм действий?