使用Erlang和Docker容器。我跨两个容器创建了一个玩具应用程序:客户端和服务器。这是docker-compose.yml文件:
version: '2'
services:
client:
image: test3_client
links:
- server
server:
image: test3_server
这是服务器的Dockerfile
FROM erlang:19.0
ADD . /app
WORKDIR /app
CMD erl -sname server -setcookie abc -noshell -s test3 start
(客户端大致相同,只有名称client
并且进入test3的client
函数。这是Erlang代码:
-module (test3).
-compile(export_all).
start() ->
register(greeter, spawn(fun() -> loop() end)) .
loop() ->
io:format("server loop~n"),
receive
{greeting, Sender, Name} ->
io:format("greeting: ~w~n", [Name]),
Sender ! {response, self(), "Yowser " + Name}
end,
loop() .
client() ->
timer:sleep(250),
ok = ping_server(10),
greeter ! {greeting, self, "diego"},
receive
{response, Pid, Greeting} ->
io:format("I was greeted: " + Greeting + "!~n")
end .
ping_server(Count) ->
case Count of
X when X < 1 ->
{error, "unable to reach server"};
_ ->
case net_adm:ping(server) of
pong ->
io:format("found server~n"),
ok ;
pang ->
io:format("unable to reach server~n"),
timer:sleep(1000),
ping_server(Count - 1)
end
end .
当我使用docker-compose up
运行容器时,我得到了这个:
docker-compose up
Creating network "test3_default" with the default driver
Creating test3_server_1
Creating test3_client_1
Attaching to test3_server_1, test3_client_1
server_1 | server loop
client_1 | unable to reach server
client_1 | unable to reach server
client_1 | unable to reach server
client_1 | unable to reach server
client_1 | unable to reach server
. . .
最终客户感到无聊并放弃。
你能看到我出错的地方吗?
我见过Chris Smith的this post,这真的很棒。但是Chris正在使用套接字,而我想利用本机Erlang消息传递...
答案 0 :(得分:1)
可能存在多个问题,但我发现至少有一个问题是您尝试ping server
那里不是有效的节点名称。当您启动Erlang节点时,它会获得一个<name>@<host>
形式的名称,其中host是运行它的机器的主机名。我不确定它如何适用于容器。您可以尝试在服务器上运行node()
以查看整个节点名称,并将net_adm:ping()
更改为指向该名称。