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.