【问题标题】:Docker PostgreSQL - Scripts in /docker-entrypoint-initdb.d doesn't runDocker PostgreSQL - /docker-entrypoint-initdb.d 中的脚本不运行
【发布时间】:2016-11-02 17:32:24
【问题描述】:

所以,我有一个具有这种结构的 docker-compose 项目:

DockerDev
- docker-compose.yaml
- d-php
  - Dockerfile
  - scripts-apache
- d-postgresql
  - Dockerfile
  - scripts
    - dev_data_setup.sql
- logs
- pgdata
- www

PHP、Redis、ElasticSearch 都可以。但是 Postgresql 不运行 dev_data_setup.sql,我发现 /dockes-entrypoint-initdb.d 有任何不同的解决方案(卷、添加、复制等)。我试图运行和 sh 脚本,什么都没有。

你能看到这个 docker-compose 和 Dockerfile 并帮助我吗?谢谢

Dockerfile:

FROM postgres:latest
ADD ./scripts/dev_data_setup.sql /docker-entrypoint-initdb.d

docker-compose.yaml:

version: '2'
services:
  php:
    build: ./d-php/
    hostname: www.domain.com
    ports:
      - "80:80"
    volumes:
      - ./www:/var/www/html
      - ./d-php/scripts-apache2/apache2.conf:/etc/apache2/apache2.conf
      - ./d-php/scripts-apache2/web.conf:/etc/apache2/sites-enabled/web.conf
      - ./d-php/scripts-apache2/webservice.conf:/etc/apache2/sites-enabled/webservice.conf
      - ./logs:/var/log/apache2
    links:
      - db
      - redis
      - elasticsearch
  db:
    build: ./d-postgresql/
    volumes:
      - ./pgdata:/pgdata
    environment:
      - POSTGRES_USER=postgres
      - POSTGRES_PASSWORD=postgres
      - PGDATA=/pgdata
  redis:
    image: redis:latest
  elasticsearch:
    image: elasticsearch:2.4.1

【问题讨论】:

  • 对我来说很合适。如果您执行到 postgres 容器中,您可以在/docker-entrypoint-initdb.d/ 中看到您的文件。试试:docker-compose exec db ls -al /docker-entrypoint-initdb.d/。同时发布日志可能会有所帮助:docker-compose logs db
  • 好吧,关于 /docker-entrypoint-initdb.d/ 在 postgres 容器中,非常感谢! :)
  • 文件在那里。这是来自 db 的日志:
  • db_1 | LOG:数据库系统被中断;最后一次知道在 2016-11-02 17:11:33 UTC db_1 | LOG:数据库系统未正确关闭;正在自动恢复 db_1 |日志:0/14EE338 处的记录长度无效:想要 24,得到 0 db_1 |日志:不需要重做 db_1 |日志:Mu​​ltiXact 成员环绕保护现已启用 db_1 | LOG:数据库系统已准备好接受连接 db_1 | LOG:autovacuum 启动器已启动
  • db_1 |致命:用户“用户”db_1 的密码验证失败 |详细信息:角色“用户”不存在。 db_1 |连接匹配 pg_hba.conf 第 95 行:“host all all 0.0.0.0/0 md5”

标签: postgresql docker docker-compose


【解决方案1】:

所以我发现了问题。

  • 首先:我的 sql 脚本试图重新创建 postgres 用户。然后,dockedev_db 退出了。
  • 第二:我需要删除所有与 db 相关的图像,以便 docker-compose 再次运行脚本。

感谢您的帮助。

【讨论】:

    【解决方案2】:

    您的问题是由您在 Dockerfile 中使用 ADD 的方式引起的:

    FROM postgres:latest
    ADD ./scripts/dev_data_setup.sql /docker-entrypoint-initdb.d
    

    这将创建一个名为/docker-entrypoint-initdb.d 的文件,其中包含dev_data_setup.sql 文件的内容。您想要的是将/docker-entrypoint-initdb.d 视为一个目录。

    您应该将ADD 命令更改为以下之一:

    ADD ./scripts/dev_data_setup.sql /docker-entrypoint-initdb.d/
    

    尾部斜杠会将dest 参数视为目录。或者使用

    ADD ./scripts/dev_data_setup.sql /docker-entrypoint-initdb.d/dev_data_setup.sql
    

    这将具体拼出文件名。

    参考:https://docs.docker.com/engine/reference/builder/#/add

    如果<dest> 不以斜杠结尾,则将其视为常规文件,<src> 的内容将写入<dest>

    【讨论】:

    • 谢谢,我也试过了。它不工作。脚本被复制,但容器在启动数据库时不运行脚本。怎么说呢,我尝试了很多不同的配置,包括安装卷。没别的了。有一段时间,我正在使用带有 postgresql 安装的 Ubuntu 映像,它正在工作。
    • 看起来你遇到了这个问题:github.com/docker-library/postgres/issues/193
    • 愚蠢的建议:chmod 755 dev_data_setup.sql,然后再构建。 docker 不会运行不可执行的东西。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-04
    相关资源
    最近更新 更多