Docker e sockets java: compartilhe dados entre contêineres
Estou codificando um serviço cliente-servidor em que meu servidor está enviando arquivos para o cliente.
No exemplo a seguir, tentei enviar uma lista de nomes de arquivos para meu 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++;
}
Portanto, quando executo meu programa no Java NetBeans IDE, ele funciona como desejo. Eu pego os arquivos
<---Available files--->
1)blank.wav
2)fuark.wav
Para a conexão docker, criei uma rede com
docker network create client_server_network
Eu corro o servidor com
docker run --env SERVER_HOST_ENV=server --network-alias server --network client_server_network -it server
e o cliente com
docker run --network client_server_network -it clientimage
Embora a conexão cliente-servidor seja bem-sucedida por meio de contêineres docker, quando executo os dois serviços, não recebo nenhuma saída.
<---Available files--->
Estou preso nisso há dias. O que pode estar errado? Se eu devo fornecer qualquer outra informação, por favor me diga.
PS no lado do servidor do docker Eu defino a imagem do servidor como o hostnewclientSocket = new Socket("server", 4000)
Respostas
O contêiner tem seu próprio sistema de arquivos diferente do sistema de arquivos do host. Seu caminho C:\ServerMusicStorage
não pode funcionar em seu contêiner porque este arquivo não está em seu contêiner.
Você deve dar uma olhada para ligar ou volume
Ou copiando o arquivo ao criar sua imagem.
Além disso, seu caminho é um caminho do Windows, você deve alterá-lo para um caminho Unix (/ seu diretório) porque a maioria das imagens docker são do sistema Linux
Se você deseja usar COPY em seu DockerFile, basta adicionar
COPY ServerMusicStorage/ /ServerMusicStorage
Mas se eu não me engano, o arquivo src deve ser um caminho relativo ... relacionado a Então você deve colocar / ServerMusicStorage próximo ao seu diretório de compilação