Docker và java sockets: Chia sẻ dữ liệu giữa các vùng chứa

Jan 11 2021

Tôi đang viết mã một dịch vụ máy chủ-máy khách trong đó máy chủ của tôi đang gửi tệp đến máy khách.

Trong ví dụ sau, tôi đã cố gắng gửi danh sách tên tệp cho khách hàng của mình.

Người phục vụ

serverSocket = new ServerSocket(4000);
connsock = serverSocket.accept();
objectOutput = new ObjectOutputStream(connsock.getOutputStream());

List<String> file_names = new ArrayList<String>();
File[] files = new File("C:\\ServerMusicStorage").listFiles();

for (File file : files) {
    if (file.isFile()) {
        file_names.add(file.getName());
    }
}
objectOutput.writeObject(file_names);
objectOutput.flush();

Khách hàng

newclientSocket = new Socket("localhost", 4000);
objectInput1 = new ObjectInputStream(newclientSocket.getInputStream());

System.out.println("<---Available files--->");

// get list of files from server
Object file_names = objectInput1.readObject();
file_list = (ArrayList<String>) file_names;
int count = 1;

for (int i = 0; i < file_list.size(); i++) {
    System.out.println(count + ")" + file_list.get(i));
    count++;
}

Vì vậy, khi tôi chạy chương trình của mình tại java NetBeans IDE, nó hoạt động như tôi muốn. Tôi nhận được các tập tin

<---Available files--->
1)blank.wav
2)fuark.wav

Đối với kết nối docker, tôi đã tạo một mạng với

docker network create client_server_network

Tôi chạy máy chủ với

docker run --env SERVER_HOST_ENV=server --network-alias server --network client_server_network -it server

và khách hàng với

docker run --network client_server_network -it clientimage

Mặc dù kết nối máy khách-máy chủ thành công thông qua bộ chứa docker, nhưng khi tôi chạy cả hai dịch vụ, tôi không nhận được bất kỳ đầu ra nào.

<---Available files--->

Tôi bị mắc kẹt trong điều này trong nhiều ngày. Điều gì có thể sai? Nếu tôi cần cung cấp bất kỳ thông tin nào khác, xin vui lòng cho tôi biết.

PS ở phía máy chủ của docker, tôi đã đặt hình ảnh máy chủ làm máy chủ lưu trữnewclientSocket = new Socket("server", 4000)

Trả lời

Ruokki Jan 11 2021 at 16:48

Vùng chứa có hệ thống tệp riêng của chúng khác với hệ thống tệp máy chủ. Đường dẫn của bạn C:\ServerMusicStoragekhông thể hoạt động trong vùng chứa của bạn vì tệp này không có trong vùng chứa của bạn.

Bạn nên xem liên kết hoặc khối lượng

Hoặc sao chép tệp khi tạo hình ảnh của bạn.

Ngoài ra, đường dẫn của bạn là đường dẫn cửa sổ, bạn nên thay đổi nó thành đường dẫn unix (/ yourdirectory) vì hầu hết các hình ảnh docker là hệ thống linux

Nếu bạn muốn sử dụng COPY trong DockerFile của mình, chỉ cần thêm

COPY ServerMusicStorage/ /ServerMusicStorage 

Nhưng nếu tôi không nhầm thì tệp src phải là một đường dẫn tương đối ... liên quan đến Vì vậy, bạn phải đặt / ServerMusicStorage gần dir xây dựng của bạn