This commit is contained in:
anlicheng 2025-09-18 16:23:43 +08:00
parent 38b46874d3
commit 929a736b17
6 changed files with 39 additions and 16 deletions

View File

@ -165,7 +165,23 @@ gather_output(Port, Acc) ->
{Status, iolist_to_binary(Acc)} {Status, iolist_to_binary(Acc)}
end. end.
extract_sha256(Output) when is_binary(Output) ->
Parts = binary:split(Output, <<$\n>>, [global]),
lager:debug("parts: ~p", [Parts]),
case lists:search(fun(Line) -> starts_with(Line, <<"Digest:">>) end, Parts) of
{value, Digest} ->
Sha256 = lists:last(binary:split(Digest, <<":">>, [global])),
{ok, Sha256};
false ->
error
end.
starts_with(Binary, Prefix) when is_binary(Binary), is_binary(Prefix) ->
PrefixSize = byte_size(Prefix),
case Binary of
<<Prefix:PrefixSize/binary, _Rest/binary>> -> true;
_ -> false
end.
%% %%
build_options(Config) -> build_options(Config) ->

View File

@ -10,7 +10,7 @@
-author("anlicheng"). -author("anlicheng").
%% API %% API
-export([ensure_dir/2, get_dir/2]). -export([ensure_dir/2, get_dir/2, ensure_etc_dir/1]).
-spec ensure_dir(RootDir :: string(), ContainerName :: binary()) -> {ok, ServerRootDir :: string()}. -spec ensure_dir(RootDir :: string(), ContainerName :: binary()) -> {ok, ServerRootDir :: string()}.
ensure_dir(RootDir, ContainerName) when is_list(RootDir), is_binary(ContainerName) -> ensure_dir(RootDir, ContainerName) when is_list(RootDir), is_binary(ContainerName) ->
@ -19,6 +19,13 @@ ensure_dir(RootDir, ContainerName) when is_list(RootDir), is_binary(ContainerNam
ok = filelib:ensure_dir(ContainerRootDir), ok = filelib:ensure_dir(ContainerRootDir),
{ok, ContainerRootDir}. {ok, ContainerRootDir}.
-spec ensure_etc_dir(ContainerDir :: string()) -> {ok, EtcDir :: string()}.
ensure_etc_dir(ContainerDir) when is_list(ContainerDir) ->
%%
EtcDir = ContainerDir ++ "etc/",
ok = filelib:ensure_dir(EtcDir),
{ok, EtcDir}.
-spec get_dir(RootDir :: string(), ContainerName :: binary()) -> {ok, ServerRootDir :: string()} | error. -spec get_dir(RootDir :: string(), ContainerName :: binary()) -> {ok, ServerRootDir :: string()} | error.
get_dir(RootDir, ContainerName) when is_list(RootDir), is_binary(ContainerName) -> get_dir(RootDir, ContainerName) when is_list(RootDir), is_binary(ContainerName) ->
%% %%

View File

@ -59,8 +59,7 @@ test() ->
<<"tmpfs">> => [<<"/tmp">>], <<"tmpfs">> => [<<"/tmp">>],
<<"extra_hosts">> => [<<"host1:192.168.0.1">>], <<"extra_hosts">> => [<<"host1:192.168.0.1">>],
<<"healthcheck">> => #{ <<"healthcheck">> => #{
%<<"test">> => [<<"CMD-SHELL">>, <<"curl -f http://localhost || exit 1">>], <<"test">> => [<<"CMD-SHELL">>, <<"curl -f http://localhost || exit 1">>],
<<"test">> => [<<"CMD">>, <<"ls">>, <<"-l">>],
<<"interval">> => <<"30s">>, <<"interval">> => <<"30s">>,
<<"timeout">> => <<"10s">>, <<"timeout">> => <<"10s">>,
<<"retries">> => 3 <<"retries">> => 3
@ -195,11 +194,11 @@ do_deploy(TaskId, ContainerDir, Config) when is_integer(TaskId), is_list(Contain
-spec try_pull_image(Image :: binary()) -> ok | {error, Reason :: any()}. -spec try_pull_image(Image :: binary()) -> ok | {error, Reason :: any()}.
try_pull_image(Image) when is_binary(Image) -> try_pull_image(Image) when is_binary(Image) ->
case efka_docker_command:check_image_exist(Image) of case docker_commands:check_image_exist(Image) of
true -> true ->
ok; ok;
false -> false ->
efka_docker_command:pull_image(Image) docker_commands:pull_image(Image)
end. end.
maybe_create_env_file(_ContainerDir, []) -> maybe_create_env_file(_ContainerDir, []) ->

View File

@ -10,7 +10,6 @@
%%%------------------------------------------------------------------- %%%-------------------------------------------------------------------
-module(docker_manager). -module(docker_manager).
-author("anlicheng"). -author("anlicheng").
-include("message_pb.hrl").
-behaviour(gen_server). -behaviour(gen_server).
@ -84,7 +83,7 @@ handle_call({deploy, TaskId, Config = #{<<"container_name">> := ContainerName}},
{ok, ContainerDir} = docker_container_helper:ensure_dir(RootDir, ContainerName), {ok, ContainerDir} = docker_container_helper:ensure_dir(RootDir, ContainerName),
{ok, TaskPid} = docker_deployer:start_link(TaskId, ContainerDir, Config), {ok, TaskPid} = docker_deployer:start_link(TaskId, ContainerDir, Config),
docker_deployer:deploy(TaskPid), docker_deployer:deploy(TaskPid),
lager:debug("[efka_inetd] start deploy task_id: ~p, config: ~p", [TaskId, Config]), lager:debug("[docker_manager] start deploy task_id: ~p, config: ~p", [TaskId, Config]),
{reply, ok, State#state{task_map = maps:put(TaskPid, TaskId, TaskMap)}}; {reply, ok, State#state{task_map = maps:put(TaskPid, TaskId, TaskMap)}};
%% %%
@ -92,12 +91,14 @@ handle_call({config_container, ContainerName, Config}, _From, State = #state{roo
case docker_container_helper:get_dir(RootDir, ContainerName) of case docker_container_helper:get_dir(RootDir, ContainerName) of
{ok, ContainerDir} -> {ok, ContainerDir} ->
%% %%
ConfigFile = ContainerDir ++ "/etc/config", {ok, EtcDir} = docker_container_helper:ensure_etc_dir(ContainerDir),
ConfigFile = EtcDir ++ "config",
case file:write_file(ConfigFile, Config, [write, binary]) of case file:write_file(ConfigFile, Config, [write, binary]) of
ok -> ok ->
lager:warning("[docker_manager] write config file: ~p success", [ConfigFile]),
{reply, ok, State}; {reply, ok, State};
{error, Reason} -> {error, Reason} ->
lager:warning("[docker_manager] write config file get error: ~p", [Reason]), lager:warning("[docker_manager] write config file: ~p, get error: ~p", [ConfigFile, Reason]),
{reply, {error, <<"write config failed">>}, State} {reply, {error, <<"write config failed">>}, State}
end; end;
error -> error ->
@ -147,11 +148,11 @@ handle_info({'EXIT', TaskPid, Reason}, State = #state{task_map = TaskMap}) ->
{TaskId, NTaskMap} -> {TaskId, NTaskMap} ->
case Reason of case Reason of
normal -> normal ->
lager:debug("[efka_inetd] task_pid: ~p, exit normal", [TaskPid]), lager:debug("[docker_manager] task_pid: ~p, exit normal", [TaskPid]),
%efka_inetd_task_log:flush(TaskId); %efka_inetd_task_log:flush(TaskId);
ok; ok;
Error -> Error ->
lager:notice("[efka_inetd] task_pid: ~p, exit with error: ~p", [TaskPid, Error]), lager:notice("[docker_manager] task_pid: ~p, exit with error: ~p", [TaskPid, Error]),
%efka_inetd_task_log:stash(TaskId, <<"task aborted">>), %efka_inetd_task_log:stash(TaskId, <<"task aborted">>),
%efka_inetd_task_log:flush(TaskId) %efka_inetd_task_log:flush(TaskId)
ok ok

View File

@ -71,7 +71,7 @@ init([]) ->
shutdown => 2000, shutdown => 2000,
type => worker, type => worker,
modules => ['docker_manager'] modules => ['docker_manager']
} },
#{ #{
id => 'efka_remote_agent', id => 'efka_remote_agent',

View File

@ -163,10 +163,10 @@ handle_info({ssl_error, Socket, Reason}, State = #state{socket = Socket}) ->
handle_info({ssl_closed, Socket}, State = #state{socket = Socket}) -> handle_info({ssl_closed, Socket}, State = #state{socket = Socket}) ->
{stop, normal, State}; {stop, normal, State};
%handle_info({timeout, _, ping_ticker}, State = #state{socket = Socket}) -> handle_info({timeout, _, ping_ticker}, State = #state{socket = Socket}) ->
% ok = ssl:send(Socket, <<?PACKET_PING>>), %ok = ssl:send(Socket, <<?PACKET_PING>>),
% ping_ticker(), ping_ticker(),
% {noreply, State}; {noreply, State};
handle_info(Info, State = #state{}) -> handle_info(Info, State = #state{}) ->
lager:notice("[efka_transport] get unknown info: ~p", [Info]), lager:notice("[efka_transport] get unknown info: ~p", [Info]),