From 4692715e4ef7e1ec5461b03940f85cac4af8b18e Mon Sep 17 00:00:00 2001 From: WangFengTu Date: Sat, 27 Feb 2021 10:44:26 +0800 Subject: [PATCH 049/104] support --pull option when create/run container Signed-off-by: WangFengTu --- src/cmd/isula/base/create.c | 24 +++++++++++++++++++++++- src/cmd/isula/base/create.h | 7 +++++++ src/cmd/isula/base/run.c | 1 + src/cmd/isula/client_arguments.h | 1 + 4 files changed, 32 insertions(+), 1 deletion(-) diff --git a/src/cmd/isula/base/create.c b/src/cmd/isula/base/create.c index a531fc0e..48dc29be 100644 --- a/src/cmd/isula/base/create.c +++ b/src/cmd/isula/base/create.c @@ -59,6 +59,7 @@ struct client_arguments g_cmd_create_args = { .custom_conf.health_timeout = 0, .custom_conf.health_start_period = 0, .custom_conf.health_retries = 0, + .pull = "missing" }; static void request_pack_host_config_limit(const struct client_arguments *args, isula_host_config_t *hostconfig) @@ -1268,9 +1269,17 @@ static int client_try_to_create(const struct client_arguments *args, const struc goto out; } + if (strcmp(args->pull, "always") == 0) { + ret = client_pull(args); + if (ret != 0) { + goto out; + } + } + ret = do_client_create(args, ops, request, response); if (ret != 0) { - if (response->errmsg == NULL || strstr(response->errmsg, IMAGE_NOT_FOUND_ERROR) == NULL) { + if (response->errmsg == NULL || strstr(response->errmsg, IMAGE_NOT_FOUND_ERROR) == NULL || + strcmp(args->pull, "missing") != 0) { client_print_error(response->cc, response->server_errono, response->errmsg); goto out; } @@ -1299,6 +1308,14 @@ out: return ret; } +static bool valid_pull_option(const char *pull) +{ + if (strcmp(pull, "always") == 0 || strcmp(pull, "missing") == 0 || strcmp(pull, "never") == 0) { + return true; + } + return false; +} + /* * Create a create request message and call RPC */ @@ -1551,6 +1568,11 @@ int cmd_create_main(int argc, const char **argv) exit(ECOMMON); } + if (!valid_pull_option(g_cmd_create_args.pull)) { + COMMAND_ERROR("invalid --pull option, only \"always\"|\"missing\"|\"never\" is allowed"); + exit(ECOMMON); + } + ret = client_create(&g_cmd_create_args); if (ret != 0) { ERROR("Container \"%s\" create failed", g_cmd_create_args.name); diff --git a/src/cmd/isula/base/create.h b/src/cmd/isula/base/create.h index 1c455d40..610a289f 100644 --- a/src/cmd/isula/base/create.h +++ b/src/cmd/isula/base/create.h @@ -276,6 +276,13 @@ extern "C" { &(cmdargs).custom_conf.privileged, \ "Give extended privileges to this container", \ NULL }, \ + { CMD_OPT_TYPE_STRING, \ + false, \ + "pull", \ + 0, \ + &(cmdargs).pull, \ + "Pull image before running (\"always\"|\"missing\"|\"never\") (default \"missing\")", \ + NULL }, \ { CMD_OPT_TYPE_CALLBACK, false, "tmpfs", 0, &(cmdargs).custom_conf.tmpfs, "Mount a tmpfs directory", \ command_append_array }, \ { CMD_OPT_TYPE_BOOL, false, "tty", 't', &(cmdargs).custom_conf.tty, "Allocate a pseudo-TTY", NULL }, \ diff --git a/src/cmd/isula/base/run.c b/src/cmd/isula/base/run.c index a6068709..53e89c3d 100644 --- a/src/cmd/isula/base/run.c +++ b/src/cmd/isula/base/run.c @@ -39,6 +39,7 @@ static int run_checker(struct client_arguments *args); struct client_arguments g_cmd_run_args = { .runtime = "", .restart = "no", + .pull = "missing" }; static int local_cmd_start(const struct client_arguments *args) diff --git a/src/cmd/isula/client_arguments.h b/src/cmd/isula/client_arguments.h index adb45104..a155b863 100644 --- a/src/cmd/isula/client_arguments.h +++ b/src/cmd/isula/client_arguments.h @@ -307,6 +307,7 @@ struct client_arguments { // pull/rmi char *ref; bool plain_http; + char *pull; // logs bool follow; -- 2.25.1