Контейнер Docker выполняет ровно одну команду, и когда эта команда выполняется, контейнер завершается. Если у контейнера нет точки входа, это command:
из docker-compose.yml
, любые аргументы после имени изображения в команде docker run
или CMD
из Dockerfile
. Если у него есть точка входа (entrypoint:
, docker run --entrypoint ...
, ENTRYPOINT
), это точка входа, которая получает команду в качестве аргументов.
Вкратце: если вы передадите точку входа или команду в docker-compose.yml
, она будет запускаться вместо сервера, на котором обычно будет работать контейнер. Нет простого способа Docker запустить «ловушку» до или после основного процесса.
В вашем конкретном случае установка программного обеспечения в контейнер во время запуска является антишаблоном: его нужно повторять каждый раз при запуске контейнера, и запуск может завершиться неудачей, если внешний репозиторий пакетов не работает. Вы можете написать очень простой Dockerfile
, в том же каталоге, что и docker-compose.yml
:
FROM nextcloud
RUN apt-get update \
&& apt-get install smbclient
В docker-compose.yml
измените строку image:
на
services:
nextcloud:
build: . # instead of image:
(Что касается стиля, я бы не стал явно задавать container_name:
или network_mode:
, здесь по умолчанию настроены параметры Docker Compose. Я также не стал бы устанавливать nano
или любой другой текстовый редактор в контейнере, поскольку любые изменения, которые вы делаете локально, будут потеряны, как только вы перезапустите контейнер. Хотя вы все еще отлаживаете изображение, я бы также не стал использовать спецификацию restart: always
, хотя это разумно, если вы более уверены, что все работает. )