我想使用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我也无法执行,因为此容器未运行。
web_1 | => Booting Puma web_1 | => Rails 4.2.4 application starting in production on http://0.0.0.0:3000 web_1 | => Run
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
Dockerfile-rails
FROM rails:onbuild ENV RAILS_ENV=production
我认为我不需要发布所有的Dockerfile
UPD:我自己修复了它:我只是删除了所有容器,然后docker-compose up再次运行
docker-compose up
您正在使用onbuild映像,因此您的工作目录已安装在容器映像中。这对开发非常有好处,因为在编辑代码时会实时更新应用程序,并且例如在运行迁移时会更新主机系统。
这也意味着,每次服务器运行时,主机系统的tmp目录都将被pid文件写入,如果服务器未正确关闭,该目录将保留在该目录中。
只需从主机系统运行以下命令:
sudo rm tmp/pids/server.pid
例如,当您在docker-compose下使用foreman时,这可能是真正的痛苦,因为仅按ctrl + c不会删除pid文件。