DockerおよびJavaソケット:コンテナー間でデータを共有する

Jan 11 2021

サーバーがクライアントにファイルを送信するクライアントサーバーサービスをコーディングしています。

次の例では、ファイル名のリストをクライアントに送信しようとしました。

サーバ

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

クライアント

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

したがって、Java NetBeans IDEでプログラムを実行すると、希望どおりに動作します。ファイルを取得します

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

Docker接続用に、次のネットワークを作成しました

docker network create client_server_network

私はサーバーを実行します

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

とクライアント

docker run --network client_server_network -it clientimage

Dockerコンテナーを介したクライアント/サーバー接続は成功しますが、両方のサービスを実行すると、出力が得られません。

<---Available files--->

私はこれで何日も立ち往生しています。何が悪いのでしょうか?その他の情報を提供する必要がある場合は、教えてください。

Dockerのサーバー側のPSサーバーイメージをホストとして設定しましたnewclientSocket = new Socket("server", 4000)

回答

Ruokki Jan 11 2021 at 16:48

コンテナには、ホストファイルシステムとは異なる独自のファイルシステムがあります。C:\ServerMusicStorageこのファイルがコンテナ内にないため、パスはコンテナ内で機能しません。

バインドまたはボリュームを確認する必要があります

または、イメージの作成時にファイルをコピーします。

また、パスはWindowsパスであるため、ほとんどのDockerイメージはLinuxシステムであるため、UNIXパス(/ yourdirectory)に変更する必要があります。

DockerFileでCOPYを使用する場合は、次を追加するだけです。

COPY ServerMusicStorage/ /ServerMusicStorage 

しかし、私が間違っていない場合、srcファイルは相対パスである必要があります...に関連しているので、ビルドディレクトリの近くに/ ServerMusicStorageを配置する必要があります