fix apps
This commit is contained in:
parent
e88ad2078f
commit
069e99dc16
@ -44,10 +44,13 @@ WebSocket server:
|
|||||||
- `service_model`:DETS 服务状态表。
|
- `service_model`:DETS 服务状态表。
|
||||||
- `efka_subscription`:本地 topic 订阅中心。
|
- `efka_subscription`:本地 topic 订阅中心。
|
||||||
- `efka_client`:连接上游 TLS server 的状态机。
|
- `efka_client`:连接上游 TLS server 的状态机。
|
||||||
|
|
||||||
|
`docker` application 启动的子进程:
|
||||||
|
|
||||||
- `docker_task_reporter`:部署任务事件缓冲和转发。
|
- `docker_task_reporter`:部署任务事件缓冲和转发。
|
||||||
- `docker_deploy_manager`:部署任务管理器。
|
- `docker_deploy_manager`:部署任务管理器。
|
||||||
|
|
||||||
`docker_events` 代码存在,但在 `efka_sup` 中被注释掉了,目前默认不会启动。
|
`docker_events` 代码存在于 `apps/docker`,但目前默认不会启动。
|
||||||
|
|
||||||
## 3. 两条通信链路
|
## 3. 两条通信链路
|
||||||
|
|
||||||
@ -180,7 +183,7 @@ topic 匹配规则:
|
|||||||
部署操作:
|
部署操作:
|
||||||
|
|
||||||
1. `docker_container_service` 收到 `deploy` 后调用 `docker_deploy_manager:deploy(TaskId, Params)`。
|
1. `docker_container_service` 收到 `deploy` 后调用 `docker_deploy_manager:deploy(TaskId, Params)`。
|
||||||
2. `docker_deploy_manager` 根据 `root_dir` 和参数里的 `container_name/container_dir` 确保容器目录存在。
|
2. `docker_deploy_manager` 根据 `docker.root_dir` 和参数里的 `container_name/container_dir` 确保容器目录存在。
|
||||||
3. 它启动一个独立 `docker_deployer` 进程,并 monitor 该部署进程。
|
3. 它启动一个独立 `docker_deployer` 进程,并 monitor 该部署进程。
|
||||||
4. `docker_deployer` 执行实际部署步骤。
|
4. `docker_deployer` 执行实际部署步骤。
|
||||||
5. 部署过程事件写入 `docker_task_reporter`。
|
5. 部署过程事件写入 `docker_task_reporter`。
|
||||||
@ -261,7 +264,7 @@ topic 匹配规则:
|
|||||||
|
|
||||||
关键配置来自 `config/sys.config`:
|
关键配置来自 `config/sys.config`:
|
||||||
|
|
||||||
- `root_dir`:容器相关目录根路径。
|
- `docker.root_dir`:容器相关目录根路径。
|
||||||
- `dets_dir`:DETS 文件目录。
|
- `dets_dir`:DETS 文件目录。
|
||||||
- `websocket_server`:本地 WebSocket 监听配置。
|
- `websocket_server`:本地 WebSocket 监听配置。
|
||||||
- `tls_server_address`:上游 TLS server 地址。
|
- `tls_server_address`:上游 TLS server 地址。
|
||||||
|
|||||||
18
apps/docker/src/docker.app.src
Normal file
18
apps/docker/src/docker.app.src
Normal file
@ -0,0 +1,18 @@
|
|||||||
|
{application, docker,
|
||||||
|
[{description, "Docker integration application"},
|
||||||
|
{vsn, "0.1.0"},
|
||||||
|
{registered, []},
|
||||||
|
{mod, {docker_app, []}},
|
||||||
|
{applications,
|
||||||
|
[
|
||||||
|
gun,
|
||||||
|
kernel,
|
||||||
|
stdlib
|
||||||
|
]},
|
||||||
|
{env, [
|
||||||
|
{root_dir, "/usr/local/code/efka"}
|
||||||
|
]},
|
||||||
|
{modules, []},
|
||||||
|
{licenses, ["Apache-2.0"]},
|
||||||
|
{links, []}
|
||||||
|
]}.
|
||||||
18
apps/docker/src/docker_app.erl
Normal file
18
apps/docker/src/docker_app.erl
Normal file
@ -0,0 +1,18 @@
|
|||||||
|
%%%-------------------------------------------------------------------
|
||||||
|
%% @doc Docker application entry point.
|
||||||
|
%% @end
|
||||||
|
%%%-------------------------------------------------------------------
|
||||||
|
|
||||||
|
-module(docker_app).
|
||||||
|
|
||||||
|
-behaviour(application).
|
||||||
|
|
||||||
|
-export([start/2, stop/1]).
|
||||||
|
|
||||||
|
-spec start(term(), term()) -> {ok, pid()} | {error, term()}.
|
||||||
|
start(_StartType, _StartArgs) ->
|
||||||
|
docker_sup:start_link().
|
||||||
|
|
||||||
|
-spec stop(term()) -> ok.
|
||||||
|
stop(_State) ->
|
||||||
|
ok.
|
||||||
@ -43,7 +43,7 @@ deploy(TaskId, Params) when is_integer(TaskId), is_map(Params) ->
|
|||||||
-spec init(list()) -> {ok, #state{}}.
|
-spec init(list()) -> {ok, #state{}}.
|
||||||
init([]) ->
|
init([]) ->
|
||||||
erlang:process_flag(trap_exit, true),
|
erlang:process_flag(trap_exit, true),
|
||||||
{ok, RootDir} = application:get_env(efka, root_dir),
|
{ok, RootDir} = docker_helper:root_dir(),
|
||||||
{ok, #state{root_dir = RootDir}}.
|
{ok, #state{root_dir = RootDir}}.
|
||||||
|
|
||||||
-spec handle_call(term(), {pid(), term()}, #state{}) -> {reply, term(), #state{}}.
|
-spec handle_call(term(), {pid(), term()}, #state{}) -> {reply, term(), #state{}}.
|
||||||
@ -10,9 +10,19 @@
|
|||||||
-author("anlicheng").
|
-author("anlicheng").
|
||||||
|
|
||||||
%% API
|
%% API
|
||||||
|
-export([root_dir/0]).
|
||||||
-export([ensure_container_dir/2, ensure_container_dir/3, get_container_dir/2, get_config_file/1]).
|
-export([ensure_container_dir/2, ensure_container_dir/3, get_container_dir/2, get_config_file/1]).
|
||||||
-export([update_container_config/2]).
|
-export([update_container_config/2]).
|
||||||
|
|
||||||
|
-spec root_dir() -> {ok, string()} | undefined.
|
||||||
|
root_dir() ->
|
||||||
|
case application:get_env(docker, root_dir) of
|
||||||
|
{ok, RootDir} ->
|
||||||
|
{ok, RootDir};
|
||||||
|
undefined ->
|
||||||
|
application:get_env(efka, root_dir)
|
||||||
|
end.
|
||||||
|
|
||||||
-spec ensure_container_dir(RootDir :: string(), ContainerName :: binary()) -> {ok, ServerRootDir :: string()}.
|
-spec ensure_container_dir(RootDir :: string(), ContainerName :: binary()) -> {ok, ServerRootDir :: string()}.
|
||||||
ensure_container_dir(RootDir, ContainerName) when is_list(RootDir), is_binary(ContainerName) ->
|
ensure_container_dir(RootDir, ContainerName) when is_list(RootDir), is_binary(ContainerName) ->
|
||||||
ensure_container_dir(RootDir, ContainerName, <<>>).
|
ensure_container_dir(RootDir, ContainerName, <<>>).
|
||||||
@ -52,7 +62,7 @@ get_container_dir(RootDir, ContainerName) when is_list(RootDir), is_binary(Conta
|
|||||||
|
|
||||||
-spec update_container_config(binary(), binary()) -> ok | {error, binary()}.
|
-spec update_container_config(binary(), binary()) -> ok | {error, binary()}.
|
||||||
update_container_config(ContainerName, Config) when is_binary(ContainerName), is_binary(Config) ->
|
update_container_config(ContainerName, Config) when is_binary(ContainerName), is_binary(Config) ->
|
||||||
{ok, RootDir} = application:get_env(efka, root_dir),
|
{ok, RootDir} = root_dir(),
|
||||||
case get_container_dir(RootDir, ContainerName) of
|
case get_container_dir(RootDir, ContainerName) of
|
||||||
{ok, ContainerDir} ->
|
{ok, ContainerDir} ->
|
||||||
ConfigFile = get_config_file(ContainerDir),
|
ConfigFile = get_config_file(ContainerDir),
|
||||||
42
apps/docker/src/docker_sup.erl
Normal file
42
apps/docker/src/docker_sup.erl
Normal file
@ -0,0 +1,42 @@
|
|||||||
|
%%%-------------------------------------------------------------------
|
||||||
|
%% @doc Docker top level supervisor.
|
||||||
|
%% @end
|
||||||
|
%%%-------------------------------------------------------------------
|
||||||
|
|
||||||
|
-module(docker_sup).
|
||||||
|
|
||||||
|
-behaviour(supervisor).
|
||||||
|
|
||||||
|
-export([start_link/0]).
|
||||||
|
-export([init/1]).
|
||||||
|
|
||||||
|
-define(SERVER, ?MODULE).
|
||||||
|
|
||||||
|
-spec start_link() -> {ok, pid()} | ignore | {error, term()}.
|
||||||
|
start_link() ->
|
||||||
|
supervisor:start_link({local, ?SERVER}, ?MODULE, []).
|
||||||
|
|
||||||
|
-spec init(list()) -> {ok, {supervisor:sup_flags(), [supervisor:child_spec()]}}.
|
||||||
|
init([]) ->
|
||||||
|
SupFlags = #{strategy => one_for_one, intensity => 1000, period => 3600},
|
||||||
|
ChildSpecs = [
|
||||||
|
#{
|
||||||
|
id => docker_task_reporter,
|
||||||
|
start => {docker_task_reporter, start_link, []},
|
||||||
|
restart => permanent,
|
||||||
|
shutdown => 2000,
|
||||||
|
type => worker,
|
||||||
|
modules => [docker_task_reporter]
|
||||||
|
},
|
||||||
|
|
||||||
|
#{
|
||||||
|
id => docker_deploy_manager,
|
||||||
|
start => {docker_deploy_manager, start_link, []},
|
||||||
|
restart => permanent,
|
||||||
|
shutdown => 2000,
|
||||||
|
type => worker,
|
||||||
|
modules => [docker_deploy_manager]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
|
||||||
|
{ok, {SupFlags, ChildSpecs}}.
|
||||||
@ -6,10 +6,10 @@
|
|||||||
{applications,
|
{applications,
|
||||||
[
|
[
|
||||||
sync,
|
sync,
|
||||||
|
docker,
|
||||||
cowboy,
|
cowboy,
|
||||||
ranch,
|
ranch,
|
||||||
crypto,
|
crypto,
|
||||||
gun,
|
|
||||||
cowlib,
|
cowlib,
|
||||||
inets,
|
inets,
|
||||||
ssl,
|
ssl,
|
||||||
|
|||||||
@ -48,15 +48,6 @@ init([]) ->
|
|||||||
modules => ['efka_service_sup']
|
modules => ['efka_service_sup']
|
||||||
},
|
},
|
||||||
|
|
||||||
%#{
|
|
||||||
% id => 'docker_events',
|
|
||||||
% start => {'docker_events', start_link, []},
|
|
||||||
% restart => permanent,
|
|
||||||
% shutdown => 2000,
|
|
||||||
% type => worker,
|
|
||||||
% modules => ['docker_events']
|
|
||||||
%},
|
|
||||||
|
|
||||||
#{
|
#{
|
||||||
id => service_model,
|
id => service_model,
|
||||||
start => {service_model, start_link, []},
|
start => {service_model, start_link, []},
|
||||||
@ -91,24 +82,6 @@ init([]) ->
|
|||||||
shutdown => 2000,
|
shutdown => 2000,
|
||||||
type => worker,
|
type => worker,
|
||||||
modules => ['efka_heartbeat']
|
modules => ['efka_heartbeat']
|
||||||
},
|
|
||||||
|
|
||||||
#{
|
|
||||||
id => 'docker_task_reporter',
|
|
||||||
start => {'docker_task_reporter', start_link, []},
|
|
||||||
restart => permanent,
|
|
||||||
shutdown => 2000,
|
|
||||||
type => worker,
|
|
||||||
modules => ['docker_task_reporter']
|
|
||||||
},
|
|
||||||
|
|
||||||
#{
|
|
||||||
id => 'docker_deploy_manager',
|
|
||||||
start => {'docker_deploy_manager', start_link, []},
|
|
||||||
restart => permanent,
|
|
||||||
shutdown => 2000,
|
|
||||||
type => worker,
|
|
||||||
modules => ['docker_deploy_manager']
|
|
||||||
}
|
}
|
||||||
|
|
||||||
],
|
],
|
||||||
|
|||||||
@ -1,6 +1,5 @@
|
|||||||
[
|
[
|
||||||
{efka, [
|
{efka, [
|
||||||
{root_dir, "/usr/local/code/efka"},
|
|
||||||
{dets_dir, "/usr/local/code/tmp/dets/"},
|
{dets_dir, "/usr/local/code/tmp/dets/"},
|
||||||
|
|
||||||
{websocket_server, [
|
{websocket_server, [
|
||||||
@ -27,6 +26,10 @@
|
|||||||
|
|
||||||
]},
|
]},
|
||||||
|
|
||||||
|
{docker, [
|
||||||
|
{root_dir, "/usr/local/code/efka"}
|
||||||
|
]},
|
||||||
|
|
||||||
%% 系统日志配置,使用 OTP logger
|
%% 系统日志配置,使用 OTP logger
|
||||||
{kernel, [
|
{kernel, [
|
||||||
%% 设置 Logger 的 primary log level
|
%% 设置 Logger 的 primary log level
|
||||||
|
|||||||
@ -5,10 +5,10 @@
|
|||||||
对应代码:
|
对应代码:
|
||||||
|
|
||||||
- command 接收入口:[src/transport/efka_client.erl](/usr/local/code/cloudkit/efka/apps/efka/src/transport/efka_client.erl:177)
|
- command 接收入口:[src/transport/efka_client.erl](/usr/local/code/cloudkit/efka/apps/efka/src/transport/efka_client.erl:177)
|
||||||
- 部署任务管理:[src/docker/docker_deploy_manager.erl](/usr/local/code/cloudkit/efka/apps/efka/src/docker/docker_deploy_manager.erl:36)
|
- 部署任务管理:[docker_deploy_manager.erl](/usr/local/code/cloudkit/efka/apps/docker/src/docker_deploy_manager.erl:36)
|
||||||
- 部署执行:[src/docker/docker_deployer.erl](/usr/local/code/cloudkit/efka/apps/efka/src/docker/docker_deployer.erl:39)
|
- 部署执行:[docker_deployer.erl](/usr/local/code/cloudkit/efka/apps/docker/src/docker_deployer.erl:39)
|
||||||
- Docker JSON 构造:[src/docker/docker_container_builder.erl](/usr/local/code/cloudkit/efka/apps/efka/src/docker/docker_container_builder.erl:14)
|
- Docker JSON 构造:[docker_container_builder.erl](/usr/local/code/cloudkit/efka/apps/docker/src/docker_container_builder.erl:14)
|
||||||
- Docker API 调用:[src/docker/docker_commands.erl](/usr/local/code/cloudkit/efka/apps/efka/src/docker/docker_commands.erl:36)
|
- Docker API 调用:[docker_commands.erl](/usr/local/code/cloudkit/efka/apps/docker/src/docker_commands.erl:36)
|
||||||
|
|
||||||
## 1. 协议入口
|
## 1. 协议入口
|
||||||
|
|
||||||
@ -214,7 +214,7 @@ docker_helper:update_container_config(ContainerNameOrId, iolist_to_binary(Config
|
|||||||
`docker_deploy_manager` 会根据 `container_name` 按系统默认规则确保容器目录存在。目录固定为:
|
`docker_deploy_manager` 会根据 `container_name` 按系统默认规则确保容器目录存在。目录固定为:
|
||||||
|
|
||||||
```text
|
```text
|
||||||
efka.root_dir/container_name/
|
docker.root_dir/container_name/
|
||||||
```
|
```
|
||||||
|
|
||||||
即使旧客户端在 `params` 中携带 `container_dir`,当前 deploy 流程也会忽略它,避免 HTTP 调用方控制 efka 主机上的写入目录。
|
即使旧客户端在 `params` 中携带 `container_dir`,当前 deploy 流程也会忽略它,避免 HTTP 调用方控制 efka 主机上的写入目录。
|
||||||
@ -790,7 +790,7 @@ efka 自动补丁后输出:
|
|||||||
|
|
||||||
deploy action 的执行流程:
|
deploy action 的执行流程:
|
||||||
|
|
||||||
1. 根据 `container_name` 和 `efka.root_dir` 确保默认容器目录存在。
|
1. 根据 `container_name` 和 `docker.root_dir` 确保默认容器目录存在。
|
||||||
2. 启动独立部署进程。
|
2. 启动独立部署进程。
|
||||||
3. 部署进程上报任务事件流。
|
3. 部署进程上报任务事件流。
|
||||||
4. 规范化镜像名:如果镜像最后一段没有 tag,则补 `:latest`。
|
4. 规范化镜像名:如果镜像最后一段没有 tag,则补 `:latest`。
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user