<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Docker Compose: частые ошибки и решения для разработчиков]]></title><description><![CDATA[<p dir="auto">Docker Compose упрощает запуск нескольких контейнеров, но ошибки в конфигурации быстро ставят всё на паузу. В этой статье разберём типичные проблемы: конфликты портов, сетевые сбои, неудачные сборки и внезапные выходы контейнеров. Вы узнаете, как диагностировать и исправлять их шаг за шагом.</p>
<p dir="auto">Это поможет сэкономить часы отладки и сделать деплой стабильным. Мы пройдёмся по реальным примерам из docker-compose.yml и командам для проверки. Давайте разберёмся, почему возникают эти ошибки и как их побеждать.</p>
<h2>Конфликты портов и сетевые проблемы</h2>
<p dir="auto">Конфликты портов происходят, когда хост-машина уже использует нужный порт, а Docker пытается его занять. Например, если на порту 3000 крутится локальный сервер Node.js, команда <code>docker-compose up</code> выдаст ошибку вроде “Bind for 0.0.0.0:3000 failed: port is already allocated”. Это классика для разработчиков, тестирующих приложения.</p>
<p dir="auto">Сетевые проблемы добавляют хаоса: контейнеры не видят друг друга, хотя всё запущено. Причина часто в неправильной настройке сетей или использовании external: true без создания сети заранее. Docker ожидает, что сеть существует, но её нет — и связь рвётся. Ещё ловушка: сервисы на разных сетях или с network_mode: bridge, где DNS не работает.</p>
<p dir="auto">Вот как проверить и исправить:</p>
<ul>
<li><strong>Проверьте занятые порты</strong>: <code>lsof -i :3000</code> или <code>ss -tlnp | grep 3000</code>. Остановите процесс или смените порт в compose-файле: <code>ports: - "3001:3000"</code>.</li>
<li><strong>Осмотрите сети</strong>: <code>docker network ls</code> и <code>docker network inspect &lt;network_name&gt;</code>. Убедитесь, что все сервисы в одной сети.</li>
<li><strong>Очистите всё</strong>: <code>docker-compose down -v</code> удалит volumes и сети, пересоздаст заново.</li>
</ul>
<table class="table table-bordered table-striped">
<thead>
<tr>
<th>Проблема</th>
<th>Симптом</th>
<th>Быстрое решение</th>
</tr>
</thead>
<tbody>
<tr>
<td>Порт занят</td>
<td>Bind failed</td>
<td>Сменить хост-порт или kill процесса</td>
</tr>
<tr>
<td>Нет связи</td>
<td>Connection refused</td>
<td>Убрать network_mode: bridge</td>
</tr>
<tr>
<td>External сеть</td>
<td>Network not found</td>
<td><code>docker network create &lt;name&gt;</code></td>
</tr>
</tbody>
</table>
<p dir="auto"><em>Важно</em>: Имена сервисов — это DNS-имена, используйте их вместо localhost.</p>
<h2>Ошибки сборки Dockerfile в Compose</h2>
<p dir="auto">Сборка падает из-за синтаксиса в Dockerfile, отсутствующих зависимостей или проблем с контекстом. Команда <code>docker-compose build</code> может выдать “no build stage in current context” или зависнуть на слое. Часто виноваты кэш или .dockerignore, блокирующий файлы.</p>
<p dir="auto">Пример: если в Dockerfile COPY копирует несуществующий файл, сборка рухнет. Или base-образ недоступен. Ещё ошибка с путями: mount path must be absolute в volumes. Docker требует абсолютные пути, относительные игнорирует.</p>
<p dir="auto">Шаги по исправлению:</p>
<ol>
<li><strong>Пересоберите без кэша</strong>: <code>docker-compose build --no-cache service_name</code>.</li>
<li><strong>Проверьте config</strong>: <code>docker-compose config</code> покажет parsed yaml, выявит пути и ошибки.</li>
<li><strong>Осмотрите логи</strong>: <code>docker-compose logs build</code> для деталей.</li>
</ol>
<table class="table table-bordered table-striped">
<thead>
<tr>
<th>Ошибка сборки</th>
<th>Причина</th>
<th>Решение</th>
</tr>
</thead>
<tbody>
<tr>
<td>No build stage</td>
<td>Синтаксис Dockerfile</td>
<td>Проверить стадии</td>
</tr>
<tr>
<td>Missing deps</td>
<td>Нет пакетов</td>
<td>Добавить RUN apt install</td>
</tr>
<tr>
<td>Context issue</td>
<td>.dockerignore</td>
<td>Убрать лишнее из ignore</td>
</tr>
</tbody>
</table>
<p dir="auto"><strong>Кэш — частый убийца</strong>: Меняйте инструкции по одной, чтобы не потеряться.</p>
<h2>Контейнеры выходят сразу после старта</h2>
<p dir="auto">Контейнер стартует и тут же exits с кодом 0 или 1. Причина: команда в образе завершилась (например, скрипт без цикла) или приложение крашится из-за env-переменных. Без healthcheck зависит_on не ждёт готовности БД.</p>
<p dir="auto">Типичный случай: webapp пытается к db до её запуска. Или mounts denied из-за прав доступа. Ещё pool overlaps — сети конфликтуют по подсетям.</p>
<p dir="auto">Диагностика и фикс:</p>
<ul>
<li><strong>Логи</strong>: <code>docker-compose logs service_name</code> покажет, почему exit.</li>
<li><strong>Healthcheck</strong>: Добавьте в db: <code>healthcheck: test: ["CMD-SHELL", "pg_isready"] interval: 5s</code>.</li>
<li><strong>Зависимости</strong>: <code>depends_on: db: condition: service_healthy</code>.</li>
</ul>
<table class="table table-bordered table-striped">
<thead>
<tr>
<th>Exit-код</th>
<th>Значение</th>
<th>Действие</th>
</tr>
</thead>
<tbody>
<tr>
<td>0</td>
<td>Успех, но завершился</td>
<td>Добавить tail -f /dev/null</td>
</tr>
<tr>
<td>1</td>
<td>Ошибка app</td>
<td>Проверить env и логи</td>
</tr>
<tr>
<td>137</td>
<td>Out of memory</td>
<td>Увеличить limits</td>
</tr>
</tbody>
</table>
<p dir="auto"><em>Нюанс</em>: Используйте service_name, а не container_name для DNS.</p>
<h2>Когда Compose не слушается: права и окружение</h2>
<p dir="auto">Ошибки вроде “Mounts denied” или “error storing credentials” — из-за прав на файлы или Docker config. На Linux selinux блокирует volumes, на Windows — пути с пробелами. Env не подставляются, если ${VAR} не определена.</p>
<p dir="auto">Проверьте: <code>docker compose run --rm service env</code> покажет переменные внутри. Для credentials настройте helper.</p>
<p dir="auto">Быстрые фиксы:</p>
<ul>
<li><strong>Права volumes</strong>: <code>chmod -R 755 volumes/</code> или chown.</li>
<li><strong>Abs пути</strong>: volumes: - /full/path:/app.</li>
<li><strong>Subnets</strong>: В networks укажите ipam с уникальной подсетью.</li>
</ul>
<h2>Сетап без сюрпризов в production</h2>
<p dir="auto">Большинство ошибок решает правильная диагностика: logs, config и network inspect. Остаётся копать редкие кейсы вроде runtime unknown или Podman-совместимости, но базовые 90% покрыты.</p>
<p dir="auto">Думайте о multi-stage builds для скорости и healthchecks для надёжности. Тестируйте изменения по одному — так проще откатить. В production добавьте restart: unless-stopped для устойчивости.</p>
]]></description><link>https://forum.exlends.ru/topic/528/docker-compose-chastye-oshibki-i-resheniya-dlya-razrabotchikov</link><generator>RSS for Node</generator><lastBuildDate>Sat, 17 Oct 2026 02:55:43 GMT</lastBuildDate><atom:link href="https://forum.exlends.ru/topic/528.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 17 Feb 2026 16:34:09 GMT</pubDate><ttl>60</ttl></channel></rss>