Intereting Posts
не может подключаться к контейнеру с помощью докер-компоновки Докер для Windows: сайт ASP.NET не может читать переменные среды, определенные в файле Dockerfile Перенос существующих контейнеров Docker в Docker Compose dockerfile не создает каталог и копирует файлы? Удаленная отладка Java 9 в контейнере докеров от IntelliJ IDEA ожидается, что cgroupsPath будет иметь формат \ "slice: prefix: name \" для systemd cgroups Перечислите все ip-адреса для одной и той же службы в докере Кластер Akka с bind-портом и bind-hostname Не удалось установить модуль postcrip php для докеров Как привести веб-страницу apache2 по умолчанию в мой браузер с помощью Dockerfile с использованием jenkins Docker – ssh по названию контейнера Мостовое сетевое подключение в Dockerfile Ошибка при установке панели инструментов docker на окна. Ошибка: подключите ECONNREFUSED 10.0.75.2:2375 Реестр: ошибка при нажатии в реестре: требуется аутентификация копирование исходных файлов из ранее запущенного контейнера докеров с использованием rkt на смонтированные тома

Сервер Rails по-прежнему работает в новом открытом контейнере для докеров

Я хочу развернуть мой проект рельсов с помощью Docker. Поэтому я использую Docker-Compose. Но я получаю одно странное сообщение об ошибке. При запуске docker-compose up (это содержит db-контейнер с postgresql, redis и веб-контейнером с рельсами), я получаю

web_1 | => Booting Puma web_1 | => Rails 4.2.4 application starting in production on http://0.0.0.0:3000 web_1 | => Run web_1 | => Booting Puma web_1 | => Rails 4.2.4 application starting in production on http://0.0.0.0:3000 web_1 | => Run сервер rails -h for more startup options web_1 | => Ctrl-C to shutdown server web_1 | A server is already running. Check /usr/src/app/tmp/pids/server.pid. web_1 | Exiting for more startup options web_1 | => Ctrl-C to shutdown server web_1 | A server is already running. Check /usr/src/app/tmp/pids/server.pid. web_1 | Exiting for more startup options web_1 | => Ctrl-C to shutdown server web_1 | A server is already running. Check /usr/src/app/tmp/pids/server.pid. web_1 | Exiting Поэтому я не понимаю, почему я получаю это сообщение, потому что каждый раз, когда я запускаю сборку докеров, запускаются новые контейнеры, а не предыдущие. Даже если вы хотите удалить эти server.pid я не могу этого сделать, потому что я этот контейнер не запущен.

мой файл docker-compose.yml

 web: dockerfile: Dockerfile-rails build: . command: bundle exec rails s -p 3000 -b '0.0.0.0' ports: - "80:3000" links: - redis - db environment: - REDISTOGO_URL=redis://user@redis:6379/ redis: image: redis db: dockerfile: Dockerfile-db build: . env_file: .env_db - web: dockerfile: Dockerfile-rails build: . command: bundle exec rails s -p 3000 -b '0.0.0.0' ports: - "80:3000" links: - redis - db environment: - REDISTOGO_URL=redis://user@redis:6379/ redis: image: redis db: dockerfile: Dockerfile-db build: . env_file: .env_db по теме web: dockerfile: Dockerfile-rails build: . command: bundle exec rails s -p 3000 -b '0.0.0.0' ports: - "80:3000" links: - redis - db environment: - REDISTOGO_URL=redis://user@redis:6379/ redis: image: redis db: dockerfile: Dockerfile-db build: . env_file: .env_db 

Dockerfile рельсы

 FROM rails:onbuild ENV RAILS_ENV=production 

Я не думаю, что мне нужно опубликовать все мои Dockerfiles

UPD: я исправил его сам: я просто удалил все свои контейнеры и снова запустил docker-compose up

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

Это также означает, что ваш каталог tmp хост-системы будет записываться вместе с pid-файлом каждый раз, когда сервер будет работать, и останется там, если сервер не будет отключен правильно.

Просто запустите эту команду из вашей хост-системы:

 sudo rm tmp/pids/server.pid 

Это может быть настоящей болью, когда вы, например, используете мастера под docker-compose, так как просто нажатие ctrl + c не удаляет файл pid.

Я был в тупике от той же проблемы, пока я не понял, что происходит на самом деле. Реальный ответ еще ниже … Сначала вы можете попробовать что-то вроде следующей команды в файле docker-compose.yml:

 command: /bin/sh -c "rm -f /rails/tmp/pids/server.pid && rails server puma" 

(Я использую Alpine и busybox, чтобы держать вещи крошечными, поэтому нет bash! Но -c будет работать и с bash). Это приведет к удалению файла, если он существует, чтобы вы не застряли в проблеме, которая сохраняется в контейнере выходить и сидеть там не могут запускать команды.

К сожалению, это НЕ хорошее решение, потому что вы добавляете дополнительный слой / bin / sh впереди сервера и не позволяете серверу получить команду stop. В результате команды остановки докеры не дают изящного выхода, и проблема всегда будет.

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

Однако реальный ответ заключается в создании простого файла docker -entry.sh и убедитесь, что вы вызываете его с помощью формы формы Entry Entry Documentation, чтобы сигналы (например, stop) попадали на серверный процесс.

 #!/bin/sh set -e if [ -f tmp/pids/server.pid ]; then rm tmp/pids/server.pid fi exec bundle exec "$@" 

ПРИМЕЧАНИЕ. Мы используем exec на последней строке, чтобы убедиться, что рельсы будут запускаться как pid 1 (то есть без дополнительной оболочки) и, таким образом, заставить сигналы останавливаться. А затем в файле Dockerfile (или compose.yml) добавьте точку входа и команду

 # Get stuff running ENTRYPOINT ["docker-entrypoint.sh"] CMD ["rails", "server", "puma"] 

И снова, вы ДОЛЖНЫ использовать формат [], чтобы он был exec'd вместо запуска как sh -c "

Для тех, у кого проблемы, когда нет tmp/pids/server.pid фактически существует:

(Версия Docker 1.11.2, сборка b9f10c9)

  1. Решение, которое сработало для меня, – это добавить точную команду к docker-compose.yml , например:

     command: rails s -b0 

    Наличие этой команды, которая на самом деле может просто дублировать CMD-вопрос .pid с устаревшим .pid , не отображается.

  2. Другой вариант, когда вам нужно использовать CMD Dockerfile, – запустить с опцией --build для восстановления изображения:

     docker-compose up --build 

    Хотя это требует времени, поэтому первое решение более удобно

То, что я сделал, Является ли идти в раш-оболочку докера:

docker-compose run web /bin/bash

затем удалите следующий файл

rm tmp/pids/server.pid

Надеюсь, что это поможет!