Gniazda Docker i Java: udostępnianie danych między kontenerami

Jan 11 2021

Koduję usługę klient-serwer, w której mój serwer wysyła pliki do klienta.

W poniższym przykładzie próbowałem wysłać listę nazw plików do mojego klienta.

serwer

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();

Klient

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++;
}

Więc kiedy uruchamiam mój program w java NetBeans IDE , działa tak, jak chcę. Mam pliki

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

Dla połączenia docker utworzyłem sieć z

docker network create client_server_network

Uruchamiam serwer z

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

a klient z

docker run --network client_server_network -it clientimage

Chociaż połączenie klient-serwer jest udane za pośrednictwem kontenerów docker, kiedy uruchamiam obie usługi, nie otrzymuję żadnych wyników.

<---Available files--->

Utknąłem w tym przez kilka dni. Co może być nie tak? Jeśli mam podać inne informacje, proszę, powiedz mi.

PS po stronie serwera dockera Ustawiłem obraz serwera jako hostanewclientSocket = new Socket("server", 4000)

Odpowiedzi

Ruokki Jan 11 2021 at 16:48

Kontener ma własny system plików inny niż system plików hosta. Twoja ścieżka C:\ServerMusicStoragenie może działać w kontenerze, ponieważ tego pliku nie ma w kontenerze.

Powinieneś spojrzeć na wiązanie lub objętość

Lub kopiowanie pliku podczas tworzenia obrazu.

Również twoja ścieżka jest ścieżką do systemu Windows, powinieneś ją zmienić na ścieżkę uniksową (/ twój katalog) ponieważ większość obrazów dockera to system Linux

Jeśli chcesz użyć COPY w swoim DockerFile, po prostu dodaj

COPY ServerMusicStorage/ /ServerMusicStorage 

Ale jeśli się nie mylę, plik src powinien być ścieżką względną ... związaną z Więc musisz umieścić / ServerMusicStorage w pobliżu katalogu kompilacji