Очередной вопрос по докеру и docker-compose. В файле Dockerfile можно определить команду RUN и entrypoint. В docker-compose.yaml я нашёл entrypoint, а вот аналога RUN не нахожу.
Как я могу сделать, скажем, установку npm пакетов при первом старте и не делать дополнительных проверок-установок при последующих docker-compose run?
Или такое можно сделать только написав и указав docker-compose'ру свой Dockerfile?
docker-compose.yml это не Dockerfile. RUN формирует ещё один слой image, а docker-compose запускает и управляет контейнерами (о различии можно найти в документации). Вот переопределить CMD можно
https://docs.docker.com/compose/compose-file/compose-file-v2/#command , но это тоже не про проверку обновлений. Часто по ENTRYPOINT указывается shell-скрипт, который покрывает все нужные проверки (типично заканчивают командой exec, чтоб передать управление собственно сервису и он был PID 1), или заготавливается ещё другой скрипт. Например, в свой docker image я включил скрипт, которым можно проверить наличие новой версии
https://github.com/unclev/prosody-docker-extended/blob/master/Dockerfile#L6 и проверить с хоста docker-compose exec —user root xmpp_server check_prosody_update . Для этого есть поддержка в соответствующем стартовом скрипте
https://github.com/unclev/prosody-docker-extended/blob/master/entrypoint.sh#L5 (от root он не будет выполнять всю эту байду под if, а сразу выполнит что передали). Не то чтобы мой вариант каноничный, но я старался.
Аналогично можно выполнить, например, docker-compose exec —user root xmpp_server apt update && docker-compose exec —user root xmpp_server apt install ... Но это не принято и обычно делать не стоит (разве что потестить перед обновлением Dockerfile). Оно не переживёт docker-comose down или docker-compose rm -f ...