如何调试Docker Odoo容器的持久数据卷挂载?

时间:2019-01-14 19:16:32

标签: docker odoo

我遵循标准的Odoo container instructions on Docker来启动所需的postgres和odoo服务器,并按照那些说明中的指示,尝试将主机目录作为这两个服务器的持久性数据存储传递:

sudo mkdir /tmp/postgres /tmp/odoo
sudo docker run -d -v /tmp/postgres:/var/lib/postgresql/data/pgdata -e POSTGRES_USER=odoo -e POSTGRES_PASSWORD=odoo -e POSTGRES_DB=postgres --name db postgres:10
sudo docker run -v /tmp/odoo:/var/lib/odoo -p 8069:8069 --name odoo --link db:db -t odoo

Odoo容器显示消息,它可以正常启动,但是当我将Web浏览器指向http://localhost:8069时,服务器没有响应。相比之下,如果我从Odoo docker run命令中省略了-v参数,则我的Web浏览器可以很好地连接到Odoo服务器,并且一切正常。

我进行了搜索,发现其他人也在努力获取持续工作的数据量的详细信息,例如Odoo development on DockerEncountered errors while bringing up the project

这似乎是Docker标准用例中的一个重大空白,用户需要有关调试的更好信息:

  • 如何调试为什么主机卷安装不适用于odoo容器,而显然却适用于postgres容器?从日志消息中我没有任何见识。

  • 尤其是,如何调试容器是否需要以某种特定方式预先配置主机数据卷才能正常工作?例如,我可以不用-v选项就可以使容器工作,这似乎应该是有帮助的,但也是不透明的。我该如何利用成功来检查这些需求实际上是什么?

Docker应该帮助您运行有用的服务而无需了解其内部结构,例如如何设置其内部数据目录。从主机挂载持久数据卷是其中的关键部分,例如这样用户就可以使用已知的工具来快照,备份和还原数据。

1 个答案:

答案 0 :(得分:0)

我想出了一些好的调试方法,它们既可以解决此问题,又通常对于解决Docker持久性数据量问题很有用。

测试1:容器可以与空的Docker卷一起使用吗?

这是一个非常简单的测试:只需创建一个新的Docker卷并将其传递到您的-v参数中(而不是主机目录的绝对路径):

sudo docker volume create hello
sudo docker run -v hello:/var/lib/odoo -p 8069:8069 --name odoo --link db:db -t odoo

odoo容器立即以这种方式成功工作(即,我的Web浏览器能够连接到Odoo服务器)。这表明它可以与(最初)空的数据目录配合使用。显而易见的问题是为什么它不能与空的主机目录卷一起使用。我已经读过Docker容器可能对UID / GID所有权感到困惑,所以我的下一个问题是如何弄清楚它的期望。

测试2:检查正在运行的容器的文件系统

我使用docker exec在正在运行的容器中获取了一个交互式bash shell:

sudo docker exec -ti odoo bash

然后在此shell中,我查看了数据目录的所有权,以获取数字UID和GID值:

ls -dn /var/lib/odoo

这向我显示了UID / GID值为101:101。 (您只需输入Control-D即可退出此Shell)

测试3:使用匹配的主机目录UID:GID重新运行容器

然后我将主机目录的所有权更改为101:101,并使用主机目录挂载重新运行odoo容器:

sudo chown 101:101 /tmp/odoo
sudo docker stop odoo
sudo docker rm odoo
sudo docker run -v /tmp/odoo:/var/lib/odoo -p 8069:8069 --name odoo --link db:db -t odoo

成功!最后,odoo容器可以与主机目录安装一起正常工作。虽然很烦人,但Odoo码头工人文档对此一无所获,如果您知道如何使用这些基本测试,则很容易调试。