【发布时间】:2017-05-05 18:07:51
【问题描述】:
我已经为此浪费了一整天的时间,并且说我对本应简单的任务的不必要的复杂性没有留下深刻的印象 - 这是一种严重的轻描淡写。
好的,我已经明白了,我正在使用 docker-machine、docker-compose、postgresql 和 redis 构建一个 django 应用程序 - 关注 this tutorial。
我已经设法让基本教程开始工作 - 但它不适合我的需要,因为我需要为我的应用程序创建一个用户和一个数据库 - 而不是同时使用“postgres”。
我已将@dnephin 的答案用于similar question,并将我的代码修改如下:
我在新目录./database/中创建了一个新的Dockerfile:
FROM postgres:9.6
COPY . /fixtures
WORKDIR /fixtures
RUN /fixtures/setup.sh
./database/setup.sh 内容:
#!/bin/bash
set -e
pg_createcluster 9.6 main --start
/etc/init.d/postgresql start
su - postgres # makes no effing difference ...
psql -f create_fixtures.sql
/etc/init.d/postgresql stop
./database/create_fixtures.sql内容:
CREATE DATABASE mydatabase WITH ENCODING 'UTF8';
CREATE USER webuser ENCRYPTED PASSWORD 'deadbeefsnaf0' NOSUPERUSER NOCREATEDB NOCREATEROLE;
GRANT ALL PRIVILEGES ON mydatabase TO webuser;
最后我在 docker_compose.yml 中的 postgres 服务被修改为使用 build:
postgres:
build: ./database/
...
当我运行 docker-compose build 时,构建会通过动作,然后 barfs 在我通过 psql 导入 SQL 固定装置文件的位置:
frothing@themouth:~/path/to/directory$ docker-compose build
redis uses an image, skipping
Building postgres
Step 1/4 : FROM postgres:9.6
---> ff0943ecbb3c
Step 2/4 : COPY . /fixtures
---> fae19dc88da8
Removing intermediate container 84b860aee55c
Step 3/4 : WORKDIR /fixtures
---> aa88438dc69f
Removing intermediate container b801ddc3b374
Step 4/4 : RUN /fixtures/setup.sh
---> Running in ca3e89ec2460
Creating new cluster 9.6/main ...
config /etc/postgresql/9.6/main
data /var/lib/postgresql/9.6/main
locale en_US.utf8
socket /var/run/postgresql
port 5432
Starting PostgreSQL 9.6 database server: main.
psql: FATAL: role "root" does not exist
ERROR: Service 'postgres' failed to build: The command '/bin/sh -c /fixtures/setup.sh' returned a non-zero code: 2
我尝试使用useless documentation on docker for postgresql service 解决这个问题 - 但没有找到。
我该如何解决这个问题?
【问题讨论】:
-
我认为你应该使用“postgres”用户而不是 root 来启动你的脚本。您可以使用
USER关键字指定用户。 -
@papey 当我在我的 ./database/DockerFile 中指定
USER postgres时(就在导入 SQL 语句文件之前)。我在运行docker-compose build时收到以下错误输出:安装:无法更改“/etc/postgresql/9.6”的所有者和权限:没有此类文件或目录安装:无法创建目录“/etc/postgresql/9.6”:权限拒绝错误:无法创建配置目录;您可能需要以 root 权限运行此程序 -
我认为这里有多个问题:1)标准docker容器内没有init,使用/etc/init.d可能会失败。 2)您的 psql 命令由 root 执行,默认 postgres 配置避免 root 用户连接。
-
@papey 感谢您提供帮助。但是仅仅猜测问题可能是什么没有帮助。关于您的建议:1)。如果您查看我发布的控制台输出,通过 init.d 启动 postgres 服务没有问题 2)。如果我使用
USER指令将用户从 root 更改为 postgresql,问题不会消失。
标签: postgresql docker docker-compose psql