iSulad/0053-support-isula-exec-workdir.patch

175 lines
7.7 KiB
Diff
Raw Normal View History

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, &params, exit_code)) {
ERROR("Runtime exec container failed");
--
2.25.1