小编典典

Rails服务器仍在新打开的Docker容器中运行

docker

我想使用Docker部署我的rails项目。因此,我使用Docker-Compose。但是我收到一个奇怪的错误消息。当运行docker-compose
up(包含db-container和postgresql,redis和带有rails的Web容器)时,我得到一个

web_1 | => Booting Puma web_1 | => Rails 4.2.4 application starting in production on http://0.0.0.0:3000 web_1 | => Runrails server -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
所以我不明白为什么会收到此消息,因为每次运行docker-
compose时,都会启动新容器,而不是先前的容器。即使要删除这些,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

Dockerfile-rails

FROM rails:onbuild

ENV RAILS_ENV=production

我认为我不需要发布所有的Dockerfile

UPD:我自己修复了它:我只是删除了所有容器,然后docker-compose up再次运行


阅读 295

收藏
2020-06-17

共1个答案

小编典典

您正在使用onbuild映像,因此您的工作目录已安装在容器映像中。这对开发非常有好处,因为在编辑代码时会实时更新应用程序,并且例如在运行迁移时会更新主机系统。

这也意味着,每次服务器运行时,主机系统的tmp目录都将被pid文件写入,如果服务器未正确关闭,该目录将保留在该目录中。

只需从主机系统运行以下命令:

sudo rm tmp/pids/server.pid

例如,当您在docker-compose下使用foreman时,这可能是真正的痛苦,因为仅按ctrl + c不会删除pid文件。

2020-06-17