【问题标题】:How to solve problem with empty docker-entrypoint-initdb.d? (PostgresQL + Docker)如何解决空 docker-entrypoint-initdb.d 的问题? (PostgreSQL + Docker)
【发布时间】:2019-08-24 14:25:31
【问题描述】:

这是我的项目结构的一部分:

这是我的 docker-compose.yml 文件的一部分:

这是我的 Dockerfile(位于 postgres-passport 文件夹中):

我有 init.sql 脚本,它应该创建用户、数据库和表(用户和数据库与 docker-compose.yml 文件中的相同)

但是当我查看我的 docker-entrypoint-initdb.d 文件夹时,它是空的(没有 init.sql 文件)。我使用这个命令:

docker exec latest_postgres-passport_1 ls -l docker-entrypoint-initdb.d/

在我的服务器 (Ubuntu) 上,我看到:

我需要你的帮助,我做错了什么?(如何使用 init.sql 脚本复制文件夹。Postgres 告诉我

/usr/local/bin/docker-entrypoint.sh:忽略 /docker-entrypoint-initdb.d/*

(因为他找不到这个文件夹)

以下所有文本格式的代码:

完整的 docker-compose.yml:

version: '3'

volumes:
  redis_data: {}
  proxy_certs: {}
  nsq_data: {}
  postgres_passport_data: {}
  storage_data: {}

services:

  # ####################################################################################################################
  # Http services
  # ####################################################################################################################
  back-passport:
    image: ${REGISTRY_BASE_URL}/backend:${TAG}
    restart: always
    expose:
      - 9000
    depends_on:
      - postgres-passport
      - redis
      - nsq
    environment:
      ACCESS_LOG: ${ACCESS_LOG}
      AFTER_CONFIRM_BASE_URL: ${AFTER_CONFIRM_BASE_URL}
      CONFIRM_BASE_URL: ${CONFIRM_BASE_URL}
      COOKIE_DOMAIN: ${COOKIE_DOMAIN}
      COOKIE_SECURE: ${COOKIE_SECURE}
      DEBUG: ${DEBUG}
      POSTGRES_URL: ${POSTGRES_URL_PASSPORT}
      NSQ_ADDR: ${NSQ_ADDR}
      REDIS_URL: ${REDIS_URL}
      SIGNING_KEY: ${SIGNING_KEY}
    command: "passport"

  # ####################################################################################################################
  # Background services
  # ####################################################################################################################
  back-email:
    image: ${REGISTRY_BASE_URL}/backend:${TAG}
    restart: always
    depends_on:
      - nsqlookup
    environment:
      DEFAULT_FROM: ${EMAIL_DEFAULT_FROM}
      NSQLOOKUP_ADDR: ${NSQLOOKUP_ADDR}
      MAILGUN_DOMAIN: ${MAILGUN_DOMAIN}
      MAILGUN_API_KEY: ${MAILGUN_API_KEY}
      TEMPLATES_DIR: "/var/templates/email"
    command: "email"

  # ####################################################################################################################
  # Frontend apps
  # ####################################################################################################################
  front-passport:
    image: ${REGISTRY_BASE_URL}/frontend-passport:${TAG}
    restart: always
    expose:
      - 80

  # ####################################################################################################################
  # Reverse proxy
  # ####################################################################################################################
  proxy:
    image: ${REGISTRY_BASE_URL}/proxy:${TAG}
    restart: always
    ports:
      - 80:80
      - 443:443
    volumes:
      - "proxy_certs:/root/.caddy"
    environment:
      CLOUDFLARE_EMAIL: ${CLOUDFLARE_EMAIL}
      CLOUDFLARE_API_KEY: ${CLOUDFLARE_API_KEY}
  #      ACME_AGREE: 'true'

  # ####################################################################################################################
  # Services (database, event bus etc)
  # ####################################################################################################################
  postgres-passport:
    image: postgres:latest
    restart: always
    expose:
      - 5432
    volumes:
      - "./postgres-passport:/docker-entrypoint-initdb.d"
      - "./data/postgres_passport_data:/var/lib/postgresql/data"
    environment:
      POSTGRES_DB: ${POSTGRES_PASSPORT_DB}
      POSTGRES_USER: ${POSTGRES_PASSPORT_USER}
      POSTGRES_PASSWORD: ${POSTGRES_PASSPORT_PASSWORD}

  redis:
    image: redis
    restart: always
    expose:
      - 6379
    volumes:
      - "redis_data:/data"

  nsqlookup:
    image: nsqio/nsq:v1.1.0
    restart: always
    expose:
      - 4160
      - 4161
    command: /nsqlookupd

  nsq:
    image: nsqio/nsq:v1.1.0
    restart: always
    depends_on:
      - nsqlookup
    expose:
      - 4150
      - 4151
    volumes:
      - "nsq_data:/data"
    command: /nsqd --lookupd-tcp-address=nsqlookup:4160 --data-path=/data

  # ####################################################################################################################
  # Ofelia cron job scheduler for docker
  # ####################################################################################################################
  scheduler:
    image: mcuadros/ofelia
    restart: always
    volumes:
      - "/var/run/docker.sock:/var/run/docker.sock:ro"
      - "./etc/scheduler:/etc/ofelia"

Dockerfile:

FROM postgres:latest

COPY init.sql /docker-entrypoint-initdb.d/

【问题讨论】:

  • dockerfileinit.sql 是否在同一个文件夹中?如果不是,那么您在这一步构建 docker 映像时是否遇到任何问题COPY init.sql /docker-entrypoint-initdb.d/
  • init.sql 和 Dockerfile 不在同一个文件夹中。但是我在构建 docker 镜像时没有遇到任何错误。
  • 我一直以为我的Dockerfile不正确,但是我找不到我的错误
  • 请提供完整的docker-compose.yml文件
  • @mchawre 我已添加

标签: postgresql docker docker-compose dockerfile


【解决方案1】:

在您的docker-compose.yml 文件中,您部分地说:

postgres-passport:
  image: postgres:latest
  volumes:
    - "./postgres-passport:/docker-entrypoint-initdb.d"
    - "./data/postgres_passport_data:/var/lib/postgresql/data"

所以你正在运行股票postgres 图像(你显示的 Dockerfile 永远不会被调用);并且您本地 postgres-passport 目录中的任何内容(从与 docker-compose.yml 文件相同的目录开始)都显示为容器内的 /docker-entrypoint-initdb.d 目录。

在你显示的目录树中,如果你

cd deploy/latest
docker-compose up

./postgres-passport 应该在deploy/latest 树中。由于它实际上并不存在,因此 Docker 不会抱怨,而是将其创建为一个空目录。

如果您只是想注入此配置文件,使用卷是一种合理的方法;你不需要 Dockerfile。但是,您需要为您尝试挂载到容器中的目录提供正确的路径。

postgres-passport:
  image: postgres:latest
  volumes:
    #  vvv Change this path vvv
    - "../../postgres-passport/docker-entrypoint-initdb.d:/docker-entrypoint-initdb.d"
    - "./data/postgres_passport_data:/var/lib/postgresql/data"

如果您想改用 Dockerfile,您需要告诉 Docker Compose 构建自定义镜像,而不是使用标准镜像。由于您正在将 init 文件构建到映像中,因此您也不需要绑定安装同一文件。

postgres-passport:
  build: ../../postgres-passport
  volumes:
    # Only this one
    - "./data/postgres_passport_data:/var/lib/postgresql/data"

(您还需要调整COPY 语句以匹配路径布局;将整个本地docker-entrypoint-initdb.d 目录复制到图像中可能是最直接的方法。)

【讨论】:

  • 您的回答对我有帮助)感谢您花时间回答我的问题,祝您好运!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多