LINUX.ORG.RU
ФорумAdmin

Почему docker commit не сохраняет изменения?

 


0

1

Делаю так с докером rocm/pytorch

Запуск

docker run -it -p 8055:8055 --cap-add=SYS_PTRACE --security-opt seccomp=unconfined --device=/dev/kfd --device=/dev/dri --group-add video --ipc=host --shm-size 8G -v /home/dn/work/:/var/lib/jenkins/work rocm/pytorch:latest
# python -m pip install ipykernel
# python -m ipykernel install --user

Выводит

Installed kernelspec python3 in /root/.local/share/jupyter/kernels/python3
# cat /root/.local/share/jupyter/kernels/python3/kernel.json
{
 "argv": [
  "/opt/conda/envs/py_3.9/bin/python",
  "-m",
  "ipykernel_launcher",
  "-f",
  "{connection_file}"
 ],
 "display_name": "Python 3 (ipykernel)",
 "language": "python",
 "metadata": {
  "debugger": true
 }

На всякий случай, чтобы сразу было видно, что именно работает меняю в display_name Python 3 на 39

Все хорошо. Проверяю в работе, работает Помогите jupyter-notebook наладить

Даже создаю файл в текущей директории, просто чтобы проверить что происходит

# pwd
/var/lib/jenkins

# echo 'changed'>changed.txt
# cat changed.txt 
changed

Затем в основной системе сохраняю изменения

$ sudo docker ps
CONTAINER ID   IMAGE                 COMMAND   CREATED          STATUS          PORTS                                       NAMES
fe34f8d28a8b   rocm/pytorch:latest   "bash"    12 minutes ago   Up 12 minutes   0.0.0.0:8055->8055/tcp, :::8055->8055/tcp   silly_carver

$ sudo docker commit fe34f8d28a8b
sha256:add8d68af7488419317ed7d3a50fc8ada58aa92163bb105026042b1a59c4f09b

Делаю exit, снова запускаю докер, все изменения пропали!!! Почему????????

# cat /root/.local/share/jupyter/kernels/python3/kernel.json
cat: cat: No such file or directory
cat: /root/.local/share/jupyter/kernels/python3/kernel.json: No such file or directory

#  cat changet.txt
cat: changet.txt: No such file or directory

При этом до этого всякие apt-get install разных пакетов комитились.

Что я не понял, почему не работает как должно, какие магические опции у команд забыл????

★★★★★

Последнее исправление: praseodim (всего исправлений: 3)

sudo docker commit fe34f8d28a8b sha256:add8d68af7488419317ed7d3a50fc8ada58aa92163bb105026042b1a59c4f09b

Ты уверен в правильности команды? Попробуй вместо sha256 хэша вписать буквами название твоего image, из которого запускаешь контейнер. Я так делаю всё работает.

ox55ff ★★★★★
()

снова запускаю докер

Запускаешь контейнер на основе образа, создаваемого docker commit? Покажи, какой командой запускаешь во второй раз.

i-rinat ★★★★★
()

И зачем ты вообще используешь commit? Не проще держать данные снаружи контейнера и прокидывать внутрь при запусках? Держать состояние внутри — не самая хорошая идея. А если хочешь иметь контейнер с установленными пакетами, просто сделай свой образ, с помощью docker build.

i-rinat ★★★★★
()

Ты всё перепутал

docker commit загружает на удалённый сервер твой image

  • во-первых, в публичный репозиторий тебе никто не даст загрузить свой image без авторизации
  • во-вторых, ты НЕ создаёшь новый image и коммитить тупо нечего

То, что ты запускаешь из image, называется container. Когда ты его удалишь, никакие изменения не сохраняются

А главная твоя проблема в том, что ты каждый раз запускаешь НОВЫЙ контейнер

Посмотри docker contailer ls -a

у тебя будет куча остановленных контейнеров

Если ты хочешь запустить тот же самый, в который ты что-то установил, тебе нужно не заново делать docker run IMAGE_NAME, а сделать docker start CONTAINER_NAME (смотри в docker container ls -a)

Уже потом, намного позже, когда ты разберёшься в разнице image и container, а также поднимешь свой собственный репозиторий, возможно ты будешь создавать свои image через docker-compose. И вот их и правда можно будет закоммитить в свой репозиторий (в котором у тебя есть права на коммит)

router ★★★★★
()
Ответ на: комментарий от i-rinat

И зачем ты вообще используешь commit? Не проще держать данные снаружи контейнера и прокидывать внутрь при запусках? Держать состояние внутри — не самая хорошая идея. А если хочешь иметь контейнер с установленными пакетами, просто сделай свой образ, с помощью docker build.

Я просто хочу локально работать с PyTorch, использующим GPU от AMD. Сколько же трудностей блин!

Для этого пришлось специальный докер для себя скачать и запустить. pytorch/rocm:last , как это на сайте AMD написано.

Работаю я с ним локально. Запустил и потом внутри докера запускаю python3 своя программа.

То есть, докер для меня - это фактически специальная версия питона.

Естественно, надо что-то под себя доделать, какие-то пакеты доустановить и т.д., без изменений просто невозможно работать.

Думал commit сохраняет что я сделал. Он вроде и сохранял сначала, потом перестал.

praseodim ★★★★★
() автор топика
Ответ на: комментарий от router

Если ты хочешь запустить тот же самый, в который ты что-то установил, тебе нужно не заново делать docker run IMAGE_NAME, а сделать docker start CONTAINER_NAME (смотри в docker container ls -a)

Хм, посмотрю.

а сделать docker start CONTAINER_NAME (смотри в docker container ls -a)

В какой момент образуются эти CONTAINER_NAME? При коммите? Или просто при запуске?

praseodim ★★★★★
() автор топика
Ответ на: комментарий от praseodim

Естественно, надо что-то под себя доделать, какие-то пакеты доустановить и т.д.

Добавь в Dockerfile, у тебя будет там конкретный список, что ты сделал.

goingUp ★★★★★
()
Ответ на: комментарий от router

docker commit загружает на удалённый сервер твой image

Вы напутали:

ТСу надо просто запускать контейнер из нового образа который создаётся при коммите.

FireFighter ★★★
()
Последнее исправление: FireFighter (всего исправлений: 1)
Ответ на: комментарий от praseodim

Вам нужно собрать свой образ на основе стандартного. Настоятельно рекомендую почитать документацию по докеру, это сохранит вам целую бездну времени.

ugoday ★★★★★
()
Ответ на: комментарий от praseodim

Создаёшь в новой пустой директории Dockerfile:

FROM rocm/pytorch:latest
MAINTAINER yourname

RUN python -m pip install ipykernel
RUN python -m ipykernel install --user

Запускаешь там «docker build -t praseodim-pytorch .», это создаст новый образ praseodim-pytorch с доустановленными пакетами. (Точка в конце команды нужна, это путь к директории с Dockerfile.)

Потом запускаешь контейнеры, как раньше, но вместо rocm/pytorch:latest используешь praseodim-pytorch.

Если в контейнере нужно что-то ещё, то можно доустанавливать прямо там, но вообще лучше обновлять команды в Dockerfile и пересобирать свой образ. Историю изменений Dockerfile рекомендую держать в git-репозитории, хотя бы в локальном. Так у тебя всегда будет способ пересобрать образ для контейнера, без заморочек типа: «забыл, какой файл правил, и теперь, когда всё сломалось, заново создать не получается».

Да, использовать commit поначалу кажется простым решением. Но чем больше им пользуешься, тем больше боли.

i-rinat ★★★★★
()
Ответ на: комментарий от router

Хм, а как подключиться к уже запущенному докеру? Докер был запущен через ssh сессию, потом сессия прервалась. Вновь подключился, докер в списке работающих

praseodim ★★★★★
() автор топика