Docker определяет более одной команды по умолчанию в Dockerfile - PullRequest
0 голосов
/ 05 ноября 2018

Если у меня есть файл 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 горячей клавиши.

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

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

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

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

Ответы [ 2 ]

0 голосов
/ 05 ноября 2018

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

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

0 голосов
/ 05 ноября 2018

Поскольку 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

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

...