查docker logs,找不到container里的路径

查报错

现在,我的Rails运行在我的container中,环境是类似于production的一个环境(staging)。当我想要测试这个环境是否搭建起来的时候,得到这样一个错误

An unhandled lowlevel error occurred. The application logs may have details.

Rails竟然知道这是一个lowlevel 的错误,微笑。让我就去查了logs。

得到这样的更具体的搞错信息:

最后检查secrets.yml发现是我把secret_key_base写成了 sercret_key_base。好,现在这个问题解决了,但是这里面主要的问题是怎么查logs。我之前不会查log,甚至因为弄错了volumes(下一节谈到),而没法找到logs。

或许我可以用进入container的方法来查logs。但是因为偶然看到mysql 官方文档上的一个说明(大意是说:mysql support docker to inspect logs),改变了我的想法:

docker logs <container name>

我之前得到的图中的报错信息就是这么来的。

找不到container里的文件路径

当我想要去运行一个container的时候,我用了这样的命令

docker-compose -f docker-compose.stg.yml run --rm stg-app rake db:create db:migrate RAILS_ENV=staging

但是得到的结果却说

/stockholm-server/Gemfile not found

这里需要说明的是,我用compose是因为compose会把yml里面的很多设置项翻译成docker run 的options。用原句说就是:

much like passing command-line parameters to docker run

而关于文件路径的那部分options叫做volumes。我在自己的compose中写成了这样,所以没有找到文件:

services:
app:
volumes:
- .:/stockholm-server

当然的是,我已经建立的app目录,在根目录下面,但是问什么找不到呢?

后来,我把路径换成了所谓的绝对路径就找到了:

services:
app:
volumes:
- /stockholm-server

这里面不同的是.:,他们是什么意思呢,让我们一起来看看compose关于这一部分的介绍:

volumes:
# Just specify a path and let the Engine create a volume
- /var/lib/mysql

这里面的问题是the Engine,但是谁是engine,这个目录更engine有什么关系。下面这张图对于描述the Engine 有帮助么?

Recall

  1. volumes知道compose去找那项目文件
  2. docker logs <container name> 可以用户查找logs,如果container支持的话。
Show your support

Clapping shows how much you appreciated Sining Liu’s story.