2014-10-24 33 views
18

tôi liên kết chứa ứng dụng của tôi để postgres trên run:Làm cách nào để liên kết vùng chứa docker khi xây dựng?

docker run --link postgres:postgres someproject/develop 

và nó làm việc tốt.

Nhưng tôi nhận ra rằng tôi cần cài đặt một số nội dung vào cơ sở dữ liệu với lệnh django trước run. Vì vậy, tôi cần liên kết trong khi build.

Tôi có thể làm như thế nào?

docker build -h không có tùy chọn --link.

+0

Bạn cần làm gì chính xác? Bạn muốn chạy một kịch bản trên cơ sở dữ liệu của bạn? – Behe

+0

@ đúng vậy. Tôi cần chạy hai lệnh quản lý django để chuẩn bị cơ sở dữ liệu cho ứng dụng. Nhưng trong thuật ngữ đơn giản - vâng, tôi cần chạy một số tập lệnh cho cơ sở dữ liệu của mình. – syabro

+0

Có thể bắt đầu cơ sở dữ liệu của bạn và điền vào nó trong khi xây dựng hình ảnh của bạn. Không thể liên kết các thùng chứa trên bản dựng. (Có thể đây là: http://mywiki.wooledge.org/XyProblem) – Behe

Trả lời

15

tôi có câu trả lời từ Docker đóng góp Brian Goff:

docker run -d --name mydb postgres 
docker run --rm --link mydb:db myrailsapp rake db:migrate 
docker run -d --name myapp --link mydb:db myrailsapp 

này sẽ cháy lên postgres. Khởi động vùng chứa di chuyển db và thoát ngay lập tức và xóa chính nó. Kích hoạt ứng dụng đường ray.

Hãy suy nghĩ về quá trình xây dựng như biên dịch một ứng dụng. Bạn không đưa dữ liệu vào cơ sở dữ liệu như một phần của giai đoạn biên dịch.

4

Bạn không thể thực hiện việc này. Bạn có thể xây dựng một hình ảnh con của postgres, hoặc cập nhật cơ sở dữ liệu mỗi khi bạn bắt đầu container.

+0

Buồn, buồn, buồn: ( – syabro

+0

@syabro Bạn đã kiểm tra lệnh ONBUILD chưa? Kiểm tra http://docs.docker.com/reference/builder/#onbuild – Robert

+0

@Rob Nó không giúp bạn – syabro

2

Tôi gặp sự cố tương tự. Tôi muốn tăng tốc độ xây dựng hình ảnh với sự trợ giúp của apt-cacher. Nó chạy trong container riêng của nó và bằng cách nào đó hình ảnh khác, mà tôi xây dựng, đã phải giao tiếp với nó.

Giải pháp là xuất bản cổng apt-cacher trên tất cả các giao diện. Điều này bao gồm ví dụ: docker0, có sẵn cho các vùng chứa trung gian sinh ra trong khi tạo hình ảnh.

Ví dụ Dockerfile:

FROM debian:8 

RUN ping -c 2 172.17.0.1 

Và đây là cách nó được xây dựng:

$ docker build - <dock 
Sending build context to Docker daemon 2.048 kB 
Step 1 : FROM debian:8 
---> 47af6ca8a14a 
Step 2 : RUN ping -c 2 172.17.0.1 
---> Running in 4f56ce7c7b63 
PING 172.17.0.1 (172.17.0.1): 56 data bytes 
64 bytes from 172.17.0.1: icmp_seq=0 ttl=64 time=0.117 ms 
64 bytes from 172.17.0.1: icmp_seq=1 ttl=64 time=0.130 ms 
--- 172.17.0.1 ping statistics --- 
2 packets transmitted, 2 packets received, 0% packet loss 
round-trip min/avg/max/stddev = 0.117/0.123/0.130/0.000 ms 
---> 5c73a36a0a6a 
Removing intermediate container 4f56ce7c7b63 
+0

bạn đã cố gắng sử dụng Làm thế nào để bạn phát hiện ra rằng ip: 172.17.0.1? – senz

+0

172.17.0.1 là địa chỉ mặc định được cấp phát cho giao diện 'docker0' (bạn có thể cấu hình nó bằng cách chuyển' --bip' sang 'docker daemon'. Theo mặc định, soạn thư sẽ cố gắng kết nối tất cả các thùng chứa dịch vụ với một mạng riêng, lại có một cây cầu và nó có một địa chỉ khác. –

3

Đúng, nhưng docker build không chấp nhận các tùy chọn --network.

Bạn có thể đặt container điều kiện tiên quyết của bạn trên mạng có tên/tùy chỉnh, ví dụ .:

docker network create whatever 
docker run --network whatever --name postgres [etc.] someproject/develop 

Sau đó xây dựng dựa trên mạng rằng:

docker build --network whatever [etc.] 

trình tốt.

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