175 lines
7.7 KiB
Diff
175 lines
7.7 KiB
Diff
From 4794f7a73a40e612c49d7c9f78fabaab0f9ab696 Mon Sep 17 00:00:00 2001
|
|
From: WangFengTu <wangfengtu@huawei.com>
|
|
Date: Thu, 11 Mar 2021 11:51:37 +0800
|
|
Subject: [PATCH 053/104] support isula exec --workdir
|
|
|
|
Signed-off-by: WangFengTu <wangfengtu@huawei.com>
|
|
---
|
|
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: <name|uid>[:<group|gid>])", \
|
|
- 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
|
|
|