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
2
3
4
5
6
7
8
9
MAINTAINER Alan He<alan@1991421.cn>
FROM postgres:latest
ENV POSTGRES_USER postgres
ENV POSTGRES_PASSWORD "bx*fF6xxxxxxxxgQwkG."
COPY ../init.sql /docker-entrypoint-initdb.d/

VOLUME /var/lib/postgresql/data
EXPOSE 5432

说明

针对以上配置,需要知道以下几点信息

  1. dockerfile中无法指定镜像名称,需要在执行docker build时-t 指明

  2. docker-compose可以直接指向dockerfile,这种情况下可以看作是latest image,具体如下

    1
    build: .

    .即docker-compose会在当前路径下寻找Dockerfile文件

  3. 如上postgres的相关参数是环境变量,因此这里使用ENV,而ARG/ENV不同,ARG是面向构建的镜像,明确化使用时需要传入的参数,这里这么写即真正使用自定义镜像时就不需要传参数了

  4. dockerfile中只明确暴露的容器端口,具体跟主机器的哪个端口绑定,是compose/docker cli的事

dockerfile/docker-compose

两者有时候会困惑,经过这次踩坑,有了多一点的理解。

  • dockerfile为单一容器服务,服务本身启动需要一些特殊的操作,比如数据库需要初始化执行某SQL,那么就很合适dockerfile,正如上述的问题。
  • compose是编排多个容器,本身容器内的一些复杂配置,本身需要在容器内部=》镜像解决。

docker调试

  1. 本地比如在WS IDE下直接即可以运行启动
  2. 在目标服务器上运行,如果出现异常,可以docker logs containerId进行日志查看

写在最后

mark

相关链接