Я хочу запустить службу с docker-compose и оставить контейнер работающим, чтобы я мог получить его IP-адрес с помощью docker inspect. Однако контейнер всегда выходит сразу после запуска.
Я пытался добавить «command: [« 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"
Он работает нормально. Если я начну с docker-compose под OS X, но если я попробую сделать то же самое под Ubuntu 16.04, он выдаст мне сообщение об ошибке выше.
Если я попробую использовать подход с Dockerfile, Dockerfile будет выглядеть так:
FROM ubuntu:latest
CMD ["sleep", "60"]
Который, кажется, ничего не делает
РЕДАКТИРОВАТЬ 2: Я должен исправить себя, оказалось, что это была та же проблема с Dockerfile и docker-compose.yml: каждый раз, когда я добавляю «CMD ...» в Dockerfile ИЛИ добавляю «command ...» в файл набора, я получаю ошибку выше с недопустимым символом. Если я удалю обе команды, все будет работать безупречно.
источник
Ответы:
Чтобы контейнер продолжал работать при запуске
docker-compose
, используйте следующую командуcommand: tail -F anything
Итак, ваш docker-compose.yml становится
и вы можете запустить оболочку, чтобы попасть в контейнер, используя следующую команду
docker exec -i -t composename_my-test_1 bash
где
composename
имя, котороеdocker-compose
предшествует вашим контейнерам.источник
exit
его, чтобы вернуться на свой хост-компьютер. Если вы находитесь на своем хосте, вы можете остановить контейнер с помощью Docker (docker stop composename_my-test_1
) или Docker Compose (docker-compose stop
)./dev/null
было бы лучше дляanything
хвостовой команды исх. stackoverflow.com/a/48732671/248616Вы можете использовать
tty
опцию конфигурации.Примечание. Если вы используете Dockerfile для изображения и
CMD
в Dockerfile, эта опция не будет работать; однако вы можете использоватьentrypoint
параметр в файле создания, который очищает файлCMD
Dockerfile.источник
tail -f /dev/null
. Благодаря этому я могу запустить контейнерную среду разработки с подключенной базой данных postgresdocker-compose up
и запустить оболочку через другой терминал, используяdocker exec
.tail -f /dev/null
илиtail -f anything
, см. Здесь: docs.docker.com/compose/compose-fileОсновываясь на комментарии @aanand на GitHub 26 августа 2015 г. , можно использовать
tail -f /dev/null
в docker-compose, чтобы контейнер работал.Пример docker-compose.yml
Почему эта команда?
Единственная причина выбора этого варианта заключалась в том, что он получил много положительных отзывов на GitHub, но самый высокий результат не означает, что это лучший ответ. Вторая причина была прагматичной, поскольку вопросы нужно было решать как можно быстрее из-за сроков.
источник
docker-compose.yml
docker-compose up -d
из терминалаdocker ps
чтобы получить идентификатор или имя контейнераdocker inspect $container_id
docker-compose exec ubuntu /bin/bash
илиdocker-compose exec ubuntu /bin/sh
docker-compose down
Вот небольшой сценарий bash (
my-docker-shell.sh
) для создания файла компоновки докеров, запуска контейнера, входа в контейнер и, наконец, очистки контейнера докеров и файла компоновки докеров при выходе из системы.#!/bin/bash cat << 'EOF' > ./docker-compose.yml --- version: "3" 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
источник
В Dockerfile вы можете использовать команду:
источник
Как заявил комментатор, нам нужно увидеть рассматриваемый файл Docker, чтобы дать вам полный ответ, но это очень распространенная ошибка. Я могу в значительной степени гарантировать, что команда, которую вы пытаетесь запустить, запускает фоновый процесс. Это может быть та команда, которую вы бы запускали в ситуациях, отличных от Docker, но это неправильно делать в Dockerfile. Например, если то, что вы используете, обычно определяется как системная служба, вы можете использовать что-то вроде «systemctl start». Это запустит процесс в фоновом режиме, что не сработает. Вы должны запустить процесс на переднем плане, поэтому весь процесс будет заблокирован.
источник
Просто небольшое примечание
Я тестировал одно изображение на основе
golang
, поэтому, когда я называюdocker-compose down
здесь, что получаю:Моя системная информация:
источник
Хорошо, я нашел свою ошибку. В файле Dockerfile для образа, используемого для создания, я указал, что базовым образом должен быть ubuntu: latest, но ранее я сам создал образ под названием ubuntu, и этот образ не работал. Поэтому я использовал не исходный образ ubuntu, а скорее поврежденную версию моего собственного образа, также называемую ubuntu.
источник