Sockets de Docker y Java: compartir datos entre contenedores
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
El contenedor tiene su propio sistema de archivos diferente del sistema de archivos del host. Su ruta C:\ServerMusicStorage
no 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