Postgres初始化脚本无法在Docker 3.4版上运行

时间:2020-03-28 11:36:58

标签: postgresql docker docker-compose dockerfile

尝试对应用程序进行docker化,在我的应用程序中,我具有以下内容

docker-compose.yml

version: '3.4'

services:
  app: 
    build:
      context: .
      dockerfile: Dockerfile
    depends_on:
      - database
    ports: 
      - "3000:3000"
    volumes:
      - .:/app
      - gem_cache:/usr/local/bundle/gems
    env_file: .env
    environment:
      RAILS_ENV: development

  database:
    image: postgres:10.12
    volumes:
      - ./init.sql/:/docker-entrypoint-initdb.d/init.sql
      - db_data:/var/lib/postgresql/data

volumes:
  gem_cache:
  db_data:

在我的init.sql文件中

CREATE USER user1 WITH PASSWORD 'password';
ALTER USER user1 WITH SUPERUSER;

我已经运行chmod +x init.sql

在我的.env文件中,我有以下内容

DATABASE_NAME=tools_development
DATABASE_USER=user1
DATABASE_PASSWORD=password
DATABASE_HOST=database

这是我的Dockerfile

FROM ruby:2.7.0

ENV BUNDLER_VERSION=2.1.4

RUN apt-get -y update --fix-missing


RUN apt-get install -y bash git build-essential nodejs libxml2-dev openssh-server libssl-dev libreadline-dev zlib1g-dev postgresql-client libcurl4-openssl-dev libxml2-dev libpq-dev tzdata

RUN gem install bundler -v 2.1.4

WORKDIR /app

COPY Gemfile Gemfile.lock ./

RUN bundle check || bundle install 

COPY . ./ 

ENTRYPOINT ["./entrypoint.sh"]

但是每次我运行docker-compose run --build并尝试运行我的应用程序时。我收到错误消息:

could not translate host name "database" to address: Name or service not known

我已经尝试了所有可能的方法,但是仍然存在相同的错误。

有人对如何解决此问题有任何想法吗?

我知道问题正在发生,因为postgres初始化脚本未运行。我在网上看到了很多选择,并且尝试了所有方法,但仍然遇到相同的错误。

感谢您的帮助

谢谢

1 个答案:

答案 0 :(得分:0)

postgres docker image documentation可以看到POSTGRES_USERPOSTGRES_PASSWORD是设置postgres容器的必要环境变量

您可以将这些环境变量添加到.env文件中。因此文件如下:

.env

DATABASE_NAME=tools_development
DATABASE_USER=user1
DATABASE_PASSWORD=password
DATABASE_HOST=database

POSTGRES_USER=user1
POSTGRES_PASSWORD=password
POSTGRES_DB=tools_development

这些环境变量将从postgres容器中用于初始化数据库并分配用户,因此您可以摆脱init.sql文件

此后,您需要在数据库(postgres:10.12)服务中添加.env文件的引用。
因此,您的docker compose文件应如下所示:

docker-compose.yml

...
  database:
    image: postgres:10.12
    volumes:
      - db_data:/var/lib/postgresql/data
    env_file: .env 
...