Здесь — почему web остановился с кодом 0 и как оставить его работать.
В контейнере работает один главный процесс — команда из docker run или команда образа. Пока он работает, контейнер Up. Процесс завершился — контейнер остановлен, а в скобках после Exited стоит его код завершения: 0 — команда закончилась без ошибки.
Всё, что главный процесс печатает, Docker сохраняет — и у остановленного контейнера тоже. Прочитать это можно командой docker logs <имя>:
У web вывода нет: httpd ничего не напечатал.
Контейнер bad создан командой sudo docker run -d --name bad alpine sh -c 'echo starting; cat /etc/app.conf'. В docker ps -a у него Exited (1). Что напечатает sudo docker logs bad?
-
В журнал контейнера попадают оба потока процесса, и вывод, и ошибки: сообщение
catо файле там тоже есть. -
Работающий контейнер нужен, чтобы запустить в нём новую команду.
docker logsничего не запускает — он читает сохранённый вывод. -
Docker хранит вывод главного процесса и после остановки:
docker logsработает и у контейнера в статусеExited.
docker logs показывает всё, что главный процесс напечатал в вывод и в поток ошибок, и у остановленного контейнера тоже. Здесь видно, что sh напечатал starting, а cat не нашёл файл — отсюда код 1.
httpd по умолчанию уходит в фон, как классический демон: запускает свою копию и завершается сам. Для Docker это конец главного процесса: контейнер останавливается, а копия в фоне останавливается вместе с ним. У таких серверов есть ключ, который оставляет их на переднем плане. Справку httpd можно прочитать во временном контейнере:
--rm удаляет контейнер, как только его команда завершилась. Остановленный web по-прежнему занимает своё имя: второй docker run --name web откажет с ошибкой Conflict. Освобождает имя docker rm web.
Оставь сервер работать
Запусти контейнер web заново так, чтобы он продолжал работать: тот же образ busybox, тот же сервер httpd на порту 8080 внутри контейнера.
Цели · 0 из 2
- Запустить web, который не останавливается ещё не выполнена
- Сервер внутри отвечает на порту 8080 ещё не выполнена