From 4794f7a73a40e612c49d7c9f78fabaab0f9ab696 Mon Sep 17 00:00:00 2001 From: WangFengTu Date: Thu, 11 Mar 2021 11:51:37 +0800 Subject: [PATCH 053/104] support isula exec --workdir Signed-off-by: WangFengTu --- src/api/services/containers/container.proto | 1 + src/client/connect/grpc/grpc_containers_client.cc | 3 +++ src/client/connect/protocol_type.c | 3 +++ src/client/connect/protocol_type.h | 1 + src/cmd/isula/stream/exec.c | 2 ++ src/cmd/isula/stream/exec.h | 4 +++- .../entry/connect/grpc/grpc_containers_service_private.cc | 3 +++ src/daemon/modules/api/runtime_api.h | 1 + src/daemon/modules/runtime/engines/engine.h | 1 + src/daemon/modules/runtime/engines/lcr/lcr_rt_ops.c | 3 +++ src/daemon/modules/service/service_container.c | 1 + 11 files changed, 22 insertions(+), 1 deletion(-) diff --git a/src/api/services/containers/container.proto b/src/api/services/containers/container.proto index efd085a1..d7adc506 100644 --- a/src/api/services/containers/container.proto +++ b/src/api/services/containers/container.proto @@ -316,6 +316,7 @@ message ExecRequest { repeated string env = 11; string user = 12; string suffix = 13; + string workdir = 14; } message ExecResponse { int32 pid = 1; diff --git a/src/client/connect/grpc/grpc_containers_client.cc b/src/client/connect/grpc/grpc_containers_client.cc index ccde59a4..6661970b 100644 --- a/src/client/connect/grpc/grpc_containers_client.cc +++ b/src/client/connect/grpc/grpc_containers_client.cc @@ -807,6 +807,9 @@ public: grequest->set_attach_stdin(request->attach_stdin); grequest->set_attach_stdout(request->attach_stdout); grequest->set_attach_stderr(request->attach_stderr); + if (request->workdir != nullptr) { + grequest->set_workdir(request->workdir); + } if (request->stdin != nullptr) { grequest->set_stdin(request->stdin); } diff --git a/src/client/connect/protocol_type.c b/src/client/connect/protocol_type.c index 94f682a8..3e5dafb1 100644 --- a/src/client/connect/protocol_type.c +++ b/src/client/connect/protocol_type.c @@ -525,6 +525,9 @@ void isula_exec_request_free(struct isula_exec_request *request) free(request->user); request->user = NULL; + free(request->workdir); + request->workdir = NULL; + util_free_array_by_len(request->argv, request->argc); request->argv = NULL; request->argc = 0; diff --git a/src/client/connect/protocol_type.h b/src/client/connect/protocol_type.h index 32f55b51..62208d98 100644 --- a/src/client/connect/protocol_type.h +++ b/src/client/connect/protocol_type.h @@ -332,6 +332,7 @@ struct isula_exec_request { char **env; int64_t timeout; char *user; + char *workdir; }; struct isula_exec_response { diff --git a/src/cmd/isula/stream/exec.c b/src/cmd/isula/stream/exec.c index d1d57268..3c8601f2 100644 --- a/src/cmd/isula/stream/exec.c +++ b/src/cmd/isula/stream/exec.c @@ -65,6 +65,7 @@ static int fill_exec_request(const struct client_arguments *args, const struct c } request->user = util_strdup_s(args->custom_conf.user); + request->workdir = util_strdup_s(args->custom_conf.workdir); if (util_dup_array_of_strings((const char **)args->argv, args->argc, &(request->argv), (size_t *)(&request->argc)) != 0) { @@ -327,6 +328,7 @@ static int remote_cmd_exec(const struct client_arguments *args, uint32_t *exit_c request.attach_stdin = args->custom_conf.attach_stdin; request.attach_stdout = args->custom_conf.attach_stdout; request.attach_stderr = args->custom_conf.attach_stderr; + request.workdir = args->custom_conf.workdir; request.argc = args->argc; request.argv = (char **)args->argv; diff --git a/src/cmd/isula/stream/exec.h b/src/cmd/isula/stream/exec.h index 1e54ab82..cd94d91f 100644 --- a/src/cmd/isula/stream/exec.h +++ b/src/cmd/isula/stream/exec.h @@ -42,7 +42,9 @@ 'u', \ &(cmdargs).custom_conf.user, \ "Username or UID (format: [:])", \ - NULL }, + NULL }, \ + { CMD_OPT_TYPE_STRING_DUP, false, "workdir", 0, &(cmdargs).custom_conf.workdir, \ + "Working directory inside the container", NULL } extern const char g_cmd_exec_desc[]; extern const char g_cmd_exec_usage[]; diff --git a/src/daemon/entry/connect/grpc/grpc_containers_service_private.cc b/src/daemon/entry/connect/grpc/grpc_containers_service_private.cc index 8e19f978..56283c8d 100644 --- a/src/daemon/entry/connect/grpc/grpc_containers_service_private.cc +++ b/src/daemon/entry/connect/grpc/grpc_containers_service_private.cc @@ -359,6 +359,9 @@ int ContainerServiceImpl::exec_request_from_grpc(const ExecRequest *grequest, co tmpreq->attach_stdout = grequest->attach_stdout(); tmpreq->attach_stderr = grequest->attach_stderr(); + if (!grequest->workdir().empty()) { + tmpreq->workdir = util_strdup_s(grequest->workdir().c_str()); + } if (!grequest->stdin().empty()) { tmpreq->stdin = util_strdup_s(grequest->stdin().c_str()); } diff --git a/src/daemon/modules/api/runtime_api.h b/src/daemon/modules/api/runtime_api.h index dde21b91..1203cde5 100644 --- a/src/daemon/modules/api/runtime_api.h +++ b/src/daemon/modules/api/runtime_api.h @@ -127,6 +127,7 @@ typedef struct _rt_exec_params_t { const char *logpath; const char *loglevel; const char **console_fifos; + const char *workdir; int64_t timeout; const char *suffix; defs_process *spec; diff --git a/src/daemon/modules/runtime/engines/engine.h b/src/daemon/modules/runtime/engines/engine.h index ced3cf22..7dd96f1e 100644 --- a/src/daemon/modules/runtime/engines/engine.h +++ b/src/daemon/modules/runtime/engines/engine.h @@ -82,6 +82,7 @@ typedef struct _engine_exec_request_t { bool tty; bool open_stdin; + const char *workdir; } engine_exec_request_t; typedef bool (*engine_create_t)(const char *, const char *, void *); diff --git a/src/daemon/modules/runtime/engines/lcr/lcr_rt_ops.c b/src/daemon/modules/runtime/engines/lcr/lcr_rt_ops.c index 27c6a631..2ed2f31e 100644 --- a/src/daemon/modules/runtime/engines/lcr/lcr_rt_ops.c +++ b/src/daemon/modules/runtime/engines/lcr/lcr_rt_ops.c @@ -390,6 +390,9 @@ int rt_lcr_exec(const char *id, const char *runtime, const rt_exec_params_t *par if (params->spec != NULL) { request.tty = params->spec->terminal; } + if (params->workdir != NULL) { + request.workdir = params->workdir; + } if (!engine_ops->engine_exec_op(&request, exit_code)) { const char *tmpmsg = NULL; diff --git a/src/daemon/modules/service/service_container.c b/src/daemon/modules/service/service_container.c index e1d698cd..ecf35821 100644 --- a/src/daemon/modules/service/service_container.c +++ b/src/daemon/modules/service/service_container.c @@ -1777,6 +1777,7 @@ static int do_exec_container(const container_t *cont, const char *runtime, char params.state = cont->state_path; params.spec = process_spec; params.attach_stdin = request->attach_stdin; + params.workdir = request->workdir; if (runtime_exec(cont->common_config->id, runtime, ¶ms, exit_code)) { ERROR("Runtime exec container failed"); -- 2.25.1