Docker определяет более одной команды по умолчанию в Dockerfile

Если у меня есть файл Docker, который имеет в конце:

ENTRYPOINT /bin/bash

и запустить контейнер через docker run и введите в терминале

gulp

это дает мне бегущий глоток, который я могу легко прекратить с Ctrl+C

но когда я ставлю gulp как команда по умолчанию для Dockerfile сюда:

CMD ["/bin/bash", "-c", "gulp"]

или это:

ENTRYPOINT ["/bin/bash", "-c", "gulp"]

затем, когда я запускаю контейнер через docker run gulp работает, но я не могу завершить его через Ctrl+C горячая клавиша.

Docker file, который я использовал для создания образа:

FROM node:8

RUN apt-get update \
    && apt-get upgrade -y \
    && apt-get install -y libltdl-dev

WORKDIR /home/workspace

RUN npm install gulp -g

#works but cant kill gulp with Ctrl+C
#CMD ["/bin/bash", "-c", "gulp"]

#works but cant kill gulp with Ctrl+C
#ENTRYPOINT ["/bin/bash", "-c", "gulp"]

# need to type command gulp in cli to run it
# but I'm able to terminate gulp with Ctrl+C
ENTRYPOINT /bin/bash

Для меня имеет смысл, что я не могу завершить команду по умолчанию для контейнера, который определен в Docker file, потому что не было бы никакой другой команды, которая могла бы выполняться после того, как я завершу работу по умолчанию.

Как я могу указать в Docker file, что я хочу запустить /bin/bash по умолчанию и вдобавок к этому gulp так что если я прекратить gulp Я вернусь к bash приглашение командной строки?

2 ответа

Поскольку gulp это инструмент для сборки, вы обычно запускаете его в процессе сборки своего контейнера, а не во время его запуска. Ваш Dockerfile может выглядеть примерно так

FROM node:8
WORKDIR /app
COPY package.json yarn.lock ./
RUN yarn install
COPY . ./
RUN gulp
CMD yarn run start

Когда ты бежишь docker buildпо пути он будет распечатывать такие вещи, как

---> b35f4035db3f
Step 6/7 : RUN gulp
---> Running in 02071fceb21b

Важно то, что последняя шестнадцатеричная строка, которая выводится на каждом шаге (строка перед каждой командой Dockerfile), является действительным идентификатором образа Docker. Если ваша сборка идет не так, вы можете

host$ sudo docker run --rm -it b35f4035db3f bash
root@38ed4261ab0f:/app# gulp

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

Gulp - это инструмент для сборки, который вам нужно установить с помощью команды run. Это зафиксирует изменения поверх вашего базового образа.
Если вы хотите использовать ее в качестве команды по умолчанию, используя ENTRYPOINT или CMD в вашем dockerfile, то вы определенно не можете уничтожить ее с помощью ctrl+c, поскольку это не процесс оболочки, а фактически выполняемый вами контейнер.
Если в случае, если у вас есть ваш dockerfile, ENTRYPOINT. Вы можете остановить контейнер с помощью Docker Stop.

ПРИМЕЧАНИЕ. Контейнер не может быть уничтожен с помощью Ctrl + C, его необходимо остановить с помощью:
остановка докера имя_ контейнера

Другие вопросы по тегам