Sockets de Docker y Java: compartir datos entre contenedores

Jan 11 2021

Estoy codificando un servicio cliente-servidor donde mi servidor envía archivos al cliente.

En el siguiente ejemplo, intenté enviar una lista de nombres de archivos a mi cliente.

Servidor

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

Cliente

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

Entonces, cuando ejecuto mi programa en java NetBeans IDE , funciona como quiero. Yo consigo los archivos

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

Para la conexión de Docker, creé una red con

docker network create client_server_network

Ejecuto el servidor con

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

y el cliente con

docker run --network client_server_network -it clientimage

Aunque la conexión cliente-servidor se realiza correctamente a través de los contenedores de la ventana acoplable, cuando ejecuto ambos servicios no obtengo ningún resultado.

<---Available files--->

Estoy atrapado en esto durante días. ¿Qué podría estar mal? Si debo proporcionar cualquier otra información, por favor dígame.

PD: en el lado del servidor de la ventana acoplable, configuré la imagen del servidor como hostnewclientSocket = new Socket("server", 4000)

Respuestas

Ruokki Jan 11 2021 at 16:48

El contenedor tiene su propio sistema de archivos diferente del sistema de archivos del host. Su ruta C:\ServerMusicStorageno puede funcionar en su contenedor porque este archivo no está en su contenedor.

Deberías echarle un vistazo para atar o dar volumen.

O copiando el archivo al crear su imagen.

Además, su ruta es una ruta de Windows, debe cambiarla por una ruta de Unix (/ su directorio) porque la mayoría de las imágenes de Docker son del sistema Linux.

Si desea usar COPY en su DockerFile, simplemente agregue

COPY ServerMusicStorage/ /ServerMusicStorage 

Pero si no me equivoco, el archivo src debería ser una ruta relativa ... relacionada con Por lo tanto, debe colocar / ServerMusicStorage cerca de su directorio de compilación