Хобрук: Ваш путь к мастерству в программировании

Запустите командную строку при запуске контейнера докеров

Насколько я понимаю, вы можете запустить командную строку при создании образа с помощью RUN или при запуске контейнера с помощью CMD. Есть ли способ сделать это при запуске контейнера докеров?

Моя цель — запустить хранилище данных gcloud автоматически сразу после ввода docker start my_container_name.

Если это возможно, какие изменения я должен применить к моему Dockerfile?

(Я уже установил все необходимые пакеты и могу запустить эту команду после docker run --name my_container_name -i -t my_image_name, но я хочу, чтобы она также запускалась при запуске контейнера)

23.03.2021

  • Я думаю, вам нужна команда docker run. например: docker run -d -p 80:80 my_image service nginx start, подробности см. в документах. 23.03.2021
  • Я думал, что при использовании docker запускается каждый раз, когда я создаю новый контейнер. Разве я не могу использовать одно и то же несколько раз? 23.03.2021
  • Каково содержимое вашего Dockerfile? 23.03.2021
  • Что ж, я устанавливаю все пакеты, с которыми работаю (python, bash, gcloud и другие зависимости), и позже я могу выполнять RUN gcloud..., а также CMD gcloud..., так что с этой командой проблем нет. Однако я хочу запустить ту же команду после автоматического создания контейнера, возможно ли это? Точно так же, как выполняется при использовании docker run, я хочу, чтобы он выполнялся с docker start 23.03.2021
  • Создание контейнера не дорого. Просто удалите старый контейнер и запустите новый с помощью новой команды. Обычно вам не нужно docker start. 23.03.2021
  • Это не понадобится, поскольку они прокомментировали в ответе, что команда также выполнялась при выполнении docker start, но я не видел вывода. С docker start -a <container_name> логи видны. Спасибо всем за ваши ответы! 23.03.2021

Ответы:


1

Docker выполняет команду RUN при сборке образа.

Docker выполняет команду ENTRYPOINT при запуске контейнера. CMD идет в качестве аргументов для ENTRYPOINT. Оба этих параметра можно переопределить, когда вы создаете контейнер из изображения. Их цель в Dockerfile — предоставить значения по умолчанию на будущее, когда вы или кто-то другой будете создавать контейнеры из этого образа.

Рассмотрим пример:

FROM debian:buster

RUN apt update && apt install procps

ENTRYPOINT ["/usr/bin/ps"]
CMD ["aux"]

Команда RUN добавляет к образу команду ps, ENTRYPOINT и CMD не выполняются, но будут выполняться при запуске контейнера:

# create a container named 'ps' using default CMD and ENTRYPOINT
docker run --name ps my_image
# equivalent to /usr/bin/ps aux

# start the existing container 'ps'
docker start ps
# equivalent to /usr/bin/ps aux

# override CMD
docker run my_image au
# equivalent to /usr/bin/ps au

# override both CMD and ENTRYPOINT
docker run --entrypoint=/bin/bash my_image -c 'echo "Hello, world!"'
# will print Hello, world! instead of using ps aux

# no ENTRYPOINT, only CMD
docker run --entrypoint="" my_image /bin/bash -c 'echo "Hello, world!"'
# the output is the same as above

Каждый раз, когда вы используете docker run, вы создаете контейнер. Используемые ENTRYPOINT и CMD сохраняются как свойства контейнера и выполняются каждый раз при запуске контейнера.

23.03.2021
  • Хотел бы я также увидеть Привет, мир! на терминале, если я запускаю docker start container_name с одним из контейнеров, созданных в результате одной из двух последних команд? Если это произойдет, это будет решение, которое я искал 23.03.2021
  • @anmarlea для этого вам нужно docker start -a <container_name>. Таким образом, он будет присоединять выходные потоки и пересылать сигналы (например, Ctrl+C). Подробнее см. docker start --help. 23.03.2021
  • Вау, я как раз искал docker start -a <container_name>. Я уже мог запустить команду при использовании docker run, но не с docker start, и это было потому, что мне не хватало аргумента -a. Большое спасибо! 23.03.2021
  • @anmarlea Дело в том, что докер выполнил команду даже без ключа -a, вы просто не видели вывод. В таком случае вы можете получить вывод, используя docker logs <container_name>. 23.03.2021
  • Я тоже рассматривал эту возможность, но провел тест, чтобы проверить это, и не смог подтвердить. Поскольку мне тоже нужны были журналы, я как-то искал, как посмотреть все это в том же терминале, поэтому мой вопрос может показаться немного запутанным (спрашивая, как запустить команду после того, как она уже запущена). Благодарю вас! 23.03.2021
  • Новые материалы

    Не зря же это называют интеллектом
    Стек — C#, Oracle Опыт — 4 года Работа — Разведывательный корпус Мне пора служить Может быть, я немного приукрашиваю себя, но там, где я живу, есть обязательная военная служба на 3..

    LeetCode Проблема 41. Первый пропущенный положительный результат
    LeetCode Проблема 41. Первый пропущенный положительный результат Учитывая несортированный массив целых чисел, найдите наименьшее пропущенное положительное целое число. Пример 1: Input:..

    Расистский и сексистский робот, обученный в Интернете
    Его ИИ основан на предвзятых данных, которые создают предрассудки. Он словно переходит из одного эпизода в другой из серии Черное зеркало , а вместо этого представляет собой хронику..

    Управление состоянием в микрофронтендах
    Стратегии бесперебойного сотрудничества Микро-фронтенды — это быстро растущая тенденция в сфере фронтенда, гарантирующая, что удовольствие не ограничивается исключительно бэкэнд-системами..

    Декларативное и функциональное программирование в стиле LINQ с использованием JavaScript с использованием каррирования и генератора ...
    LINQ - одна из лучших функций C #, которая обеспечивает элегантный способ написания кода декларативного и функционального стиля, который легко читать и понимать. Благодаря таким функциям ES6,..

    Структуры данных в C ++ - Часть 1
    Реализация общих структур данных в C ++ C ++ - это расширение языка программирования C, которое поддерживает создание классов, поэтому оно известно как C с классами . Он используется для..

    Как я опубликовал свое первое приложение в App Store в 13 лет
    Как все началось Все началось три года назад летом после моего четвертого класса в начальной школе. Для меня, четвертого класса, лето кажется бесконечным, пока оно не закончится, и мой отец..