尝试对应用程序进行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初始化脚本未运行。我在网上看到了很多选择,并且尝试了所有方法,但仍然遇到相同的错误。
感谢您的帮助
谢谢
答案 0 :(得分:0)
从postgres docker image documentation可以看到POSTGRES_USER
和POSTGRES_PASSWORD
是设置postgres容器的必要环境变量
您可以将这些环境变量添加到.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文件应如下所示:
...
database:
image: postgres:10.12
volumes:
- db_data:/var/lib/postgresql/data
env_file: .env
...