Docker Postgre部署问题
最近做服务端时有db-postgres部署需求,期间踩了点坑,这里mark下。
部署postgres服务直接挂postgres镜像即可,但牵扯到初始化数据库/及磁盘映射,我在实际操作中发现报如下错误
cannot access '/docker-entrypoint-initdb.d/': Operation not permitted
最终的解决方案是docker-compose增加privileged: true
网上有提到挂载Volume时标明RW或者采用自定义镜像时增加chmod,自测都不可行。目前唯一方案即上述。
问题解决,但相关知识点值得总结下
Postgre部署方案
部署一个PG,可以docker-compose直接挂官方镜像,然后在compose中配置,也可以自己构建镜像,最终compose编排,或者只有单个服务的话就docker run。
自定义Postgre镜像配置
关于自定义Postgre镜像大致配置如下
1 | MAINTAINER Alan He<alan@1991421.cn> |
说明
针对以上配置,需要知道以下几点信息
dockerfile中无法指定镜像名称,需要在执行docker build时-t 指明
docker-compose可以直接指向dockerfile,这种情况下可以看作是latest image,具体如下
1
build: .
.
即docker-compose会在当前路径下寻找Dockerfile
文件如上postgres的相关参数是环境变量,因此这里使用ENV,而ARG/ENV不同,ARG是面向构建的镜像,明确化使用时需要传入的参数,这里这么写即真正使用自定义镜像时就不需要传参数了
dockerfile中只明确暴露的容器端口,具体跟主机器的哪个端口绑定,是compose/docker cli的事
dockerfile/docker-compose
两者有时候会困惑,经过这次踩坑,有了多一点的理解。
- dockerfile为单一容器服务,服务本身启动需要一些特殊的操作,比如数据库需要初始化执行某SQL,那么就很合适dockerfile,正如上述的问题。
- compose是编排多个容器,本身容器内的一些复杂配置,本身需要在容器内部=》镜像解决。
docker调试
- 本地比如在WS IDE下直接即可以运行启动
- 在目标服务器上运行,如果出现异常,可以
docker logs containerId
进行日志查看
写在最后
mark