Docker Compose поддерживает работу контейнера

Я хочу запустить службу с помощью docker-compose и сохранить контейнер, чтобы я мог получить его IP-адрес с помощью "проверки докеров". Тем не менее, контейнер всегда выходит сразу после запуска.

Я попытался добавить команду "[sleep]," 60 "] и другие вещи в файл docker-compose.yml, но всякий раз, когда я добавляю строку с" command:... ", я не могу называть" docker-compose up " как я получу сообщение "Не могу запустить контейнер..... Системная ошибка: недопустимый символ" k "ищет начало значения"

Я также попытался добавить "CMD sleep 60" и еще что-то вроде самого файла Dockerfile, но эти команды, похоже, не выполняются.

Есть ли простой способ сохранить контейнер в живых или устранить одну из моих проблем?

EDIT: Вот файл Compose, который я хочу запустить:

version: '2'
services:
  my-test:
    image: ubuntu
    command: bash -c "while true; do echo hello; sleep 2; done"

Он работает нормально. Если я начну это с док-сборщика под OS X, но если я попробую то же самое в Ubuntu 16.04, это даст мне выше сообщение об ошибке.

Если я попытаюсь подойти с Dockerfile, Dockerfile будет выглядеть так:

FROM ubuntu:latest
CMD ["sleep", "60"]

Что, кажется, ничего не делает

EDIT 2: я должен исправить себя, оказалось, что это была проблема с файлом Dockerfile и docker-compose.yml: каждый раз, когда я добавляю "CMD..." в файл Dockerfile или добавляю команду "..." на файл compose, я получаю выше ошибку с недопустимым символом. Если я удалю обе команды, она работает безупречно.

Ответ 1

Чтобы контейнер работал, когда вы запускаете его с помощью docker-compose, используйте следующую команду

command: tail -F anything

Таким образом, ваш docker-compose.yml становится

version: '2'
services:
  my-test:
    image: ubuntu
    command: tail -F anything

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

docker exec -i -t composename_my-test_1 bash

где composename - это имя, которое docker-compose добавляет к вашим контейнерам.

Ответ 2

Основываясь на комментарии @aanand к GitHub 26 августа 2015 г., можно использовать tail -f /dev/null в docker-compose для поддержания работы контейнера.

Пример docker-compose.yml

version: '3'
services:
  some-app:
    command: tail -f /dev/null

Почему эта команда?

Единственная причина выбора этой опции заключалась в том, что она получила много положительных отзывов о GitHub, но ответ с наибольшим количеством голосов не означает, что это лучший ответ. Вторая причина была прагматичной, поскольку проблемы должны были быть решены как можно скорее из-за сроков.

Ответ 3

Вы можете использовать опцию конфигурации tty.

version: '3'

services:
  app:
    image: node:8
    tty: true           # <-- This option

Ответ 4

  • Создайте файл с именем docker-compose.yml
  • Добавьте следующее в файл
version: "3"

services:
  ubuntu:
    image: ubuntu:latest
    tty: true
  • Оставаясь в том же каталоге, запустите docker-compose up -d из терминала
  • Запустите docker ps, чтобы получить идентификатор контейнера или имя
  • Вы можете запустить docker inspect $container_id
  • Вы можете войти в контейнер и получить оболочку bash под управлением docker-compose exec ubuntu /bin/bash или docker-compose exec ubuntu /bin/sh
  • Когда закончите, убедитесь, что вы находитесь вне контейнера, и запустите docker-compose down

Вот небольшой bash-скрипт (my-docker-shell.sh) для создания файла компоновки docker, запуска контейнера, входа в контейнер, а затем, наконец, очистки docker-контейнера и файла docker compose при выходе из системы.

#!/bin/bash

cat << 'EOF' > ./docker-compose.yml
---

version: "3.7"

services:
  ubuntu:
    image: ubuntu:latest
    command: /bin/bash
    # tty: true

...
EOF

printf "Now entering the container...\n"
docker-compose run ubuntu bash
docker-compose down

rm -v ./docker-compose.yml

Ответ 5

В Dockerfile вы можете использовать команду:

{CMD sleep infinity}

Ответ 6

Как заявил комментатор, нам нужно будет увидеть Dockerfile, о котором идет речь, чтобы дать вам полный ответ, но это очень распространенная ошибка. Я могу в значительной степени гарантировать, что команда, которую вы пытаетесь запустить, запускает фоновый процесс. Это может быть команда, которую вы выполняете в ситуациях, отличных от Docker, но это неправильно делать в файле Docker. Например, если то, что вы используете, обычно определяется как системный сервис, вы можете использовать что-то вроде "systemctl start". Это запустило бы процесс в фоновом режиме, который не сработает. Вы должны запустить процесс на переднем плане, чтобы весь процесс блокировался.

Ответ 7

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