Docker và java sockets: Chia sẻ dữ liệu giữa các vùng chứa
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
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:\ServerMusicStorage
khô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