Docker e sockets java: compartilhe dados entre contêineres

Jan 11 2021

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

Ruokki Jan 11 2021 at 16:48

O contêiner tem seu próprio sistema de arquivos diferente do sistema de arquivos do host. Seu caminho C:\ServerMusicStoragenã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