2014-07-04 16 views
5

Tôi đang cố gắng chạy postgresql trong vùng chứa docker, nhưng tất nhiên tôi cần phải có dữ liệu cơ sở dữ liệu để liên tục, vì vậy tôi đang cố gắng sử dụng dữ liệu chỉ vùng chứa thể hiện khối lượng lưu trữ cơ sở dữ liệu tại địa điểm này.Thư mục dữ liệu Postgresql tăng có quyền sở hữu sai khi cố gắng sử dụng khối lượng

Vì vậy, nơi chứa dữ liệu của tôi có như vậy Dockerfile:

FROM ubuntu 

# Create data directory 
RUN mkdir -p /data/postgresql 

# Create /data volume 
VOLUME /data/postgresql 

Mà tôi chạy:

docker run --name postgresql_data lyapun/postgresql_data true 

Trong postgresql.conf tôi thiết lập:

data_directory = '/data/postgresql' 

Sau đó, tôi chạy của tôi container postgresql theo cách như vậy:

docker run -d --name postgre --volumes-from postgresql_data lyapun/postgresql 

Và tôi nhận:

2014-07-04 07:45:57 GMT FATAL: data directory "/data/postgresql" has wrong ownership 
2014-07-04 07:45:57 GMT HINT: The server must be started by the user that owns the data directory. 

Làm thế nào để đối phó với vấn đề này? Tôi googled rất nhiều để tìm một số thông tin về việc sử dụng postgresql với khối lượng docker, nhưng tôi đã không tìm thấy bất cứ điều gì.

Cảm ơn!

+0

Bạn bắt đầu như thế nào sau khi đăng bài? –

+0

CMD ["/ usr/lib/postgresql/9.1/bin/postgres "," -D "," /var/lib/postgresql/9.1/main "," -c "," config_file =/etc/postgresql/9.1/main/postgresql.conf "] – lyapun

+0

Bạn có phải chạy mà như là người dùng, 'postgres'? –

Trả lời

3

Ok, có vẻ như tôi tìm thấy cách giải quyết cho vấn đề này.

Thay vì chạy postgres theo cách như vậy:

CMD ["/usr/lib/postgresql/9.1/bin/postgres", "-D", "/var/lib/postgresql/9.1/main", "-c", "config_file=/etc/postgresql/9.1/main/postgresql.conf"] 

tôi đã viết bash script:

chown -Rf postgres:postgres /data/postgresql 
chmod -R 700 /data/postgresql 
sudo -u postgres /usr/lib/postgresql/9.1/bin/postgres -D /var/lib/postgresql/9.1/main -c config_file=/etc/postgresql/9.1/main/postgresql.conf 

Và thay CMD trong hình ảnh postgresql tới:

CMD ["bash", "/run.sh"] 

Nó hoạt động!

+2

Bạn có chắc chắn không? Tôi nhận thấy rằng bạn vẫn đang sử dụng '/ var/lib/postgresql/9.1/main' làm thư mục dữ liệu của bạn chứ không phải khối lượng được gắn kết'/data/postgresql'. Vì vậy, dữ liệu vẫn đang được lưu trong vùng chứa. – picardo

1

Bạn phải đặt quyền sở hữu thư mục/dữ liệu/postgresql cho cùng một người dùng, theo đó bạn đang chạy nhị phân postgresql của mình. Ví dụ, trong Ubuntu nó thường là postgres người dùng.

Sau đó, bạn phải sử dụng lệnh này:

chown postgres.postgres /data/postgresql 
+0

Trong đó Dockerfile tôi nên làm điều này? Tôi đã cố gắng và điều này đã không giúp – lyapun

+0

@lyapun phải trung thực, tôi không biết Nhưng tôi gầy k, mà bạn có thể làm điều đó, khi bạn tạo một khối lượng ... –

+0

cảm ơn nhưng người dùng postgres tạo ra trong container mà tiếp xúc với khối lượng sẽ khác nhau để postgres người dùng được tạo ra trong container postgresql. – lyapun

0

Một cách tốt hơn để giải quyết vấn đề đó, giả sử hình ảnh postgres của bạn được đặt tên là "postgres" và rằng sao lưu của bạn là ./backup.tar:

Đầu tiên, thêm video này vào postgres bạn Dockerfile:

VOLUME ["/etc/postgresql", "/var/log/postgresql", "/var/lib/postgresql"] 

Sau đó chạy:

docker run -it --name postgres -v $(pwd):/db postgres sh -c "tar xvf /db/backup.tar --no-overwrite-dir" && \ 
    docker run -it --name data --volumes-from postgres busybox true && \ 
    docker rm postgres && \ 
    docker run -it --name postgres --volumes-from=data postgres 

bạn không có vấn đề cho phép từ các kho lưu trữ được chiết xuất bởi người sử dụng postgres của hình ảnh postgres của bạn, vì vậy nó là chủ sở hữu của các tập tin được chiết xuất . Sau đó, bạn có thể sao lưu dữ liệu của mình bằng cách sử dụng vùng chứa dữ liệu. Ưu điểm của giải pháp này là bạn không chmod/chown mỗi khi bạn chạy hình ảnh.

Các vấn đề liên quan