diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/main/native/container-executor/impl/container-executor.c b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/main/native/container-executor/impl/container-executor.c index b83b768..349d881 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/main/native/container-executor/impl/container-executor.c +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/main/native/container-executor/impl/container-executor.c @@ -75,6 +75,7 @@ static const char* TC_READ_STATS_OPTS [] = { "-s", "-b", NULL}; static const int DEFAULT_DOCKER_SUPPORT_ENABLED = 0; static const int DEFAULT_TC_SUPPORT_ENABLED = 0; +static const char* DEFAULT_DOCKER_BINARY_PATH = "/usr/bin/docker"; //struct to store the user details struct passwd *user_detail = NULL; @@ -1305,9 +1306,16 @@ char* parse_docker_command_file(const char* command_file) { return ret; } +char* get_docker_binary_path(char *docker_path_from_config) { + if (docker_path_from_config == NULL) { + return (char*) DEFAULT_DOCKER_BINARY_PATH; + } + return docker_path_from_config; +} + int run_docker(const char *command_file) { char* docker_command = parse_docker_command_file(command_file); - char* docker_binary = get_value(DOCKER_BINARY_KEY, &executor_cfg); + char* docker_binary = get_docker_binary_path(get_value(DOCKER_BINARY_KEY, &executor_cfg)); size_t command_size = MIN(sysconf(_SC_ARG_MAX), 128*1024); char* docker_command_with_binary = calloc(sizeof(char), command_size); @@ -1476,10 +1484,7 @@ int launch_docker_container_as_user(const char * user, const char *app_id, docker_rm_command = calloc(sizeof(char), command_size); char *docker_command = parse_docker_command_file(command_file); - char *docker_binary = get_value(DOCKER_BINARY_KEY, &executor_cfg); - if (docker_binary == NULL) { - docker_binary = "docker"; - } + char *docker_binary = get_docker_binary_path(get_value(DOCKER_BINARY_KEY, &executor_cfg)); fprintf(LOGFILE, "Creating script paths...\n"); exit_code = create_script_paths( diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/main/native/container-executor/impl/container-executor.h b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/main/native/container-executor/impl/container-executor.h index 3eaf42e..6e19f65 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/main/native/container-executor/impl/container-executor.h +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/main/native/container-executor/impl/container-executor.h @@ -292,6 +292,10 @@ int traffic_control_read_state(char *command_file); */ int traffic_control_read_stats(char *command_file); +/** + * Get the docker binary path. + */ +char* get_docker_binary_path(char *docker_path_from_config); /** * Run a docker command passing the command file as an argument diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/main/native/container-executor/test/test-container-executor.c b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/main/native/container-executor/test/test-container-executor.c index a6e0236..88667aa 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/main/native/container-executor/test/test-container-executor.c +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/main/native/container-executor/test/test-container-executor.c @@ -52,6 +52,8 @@ static char* username = NULL; static char* yarn_username = NULL; static char** local_dirs = NULL; static char** log_dirs = NULL; +static const char* DEFAULT_DOCKER_BINARY_PATH = "/usr/bin/docker"; +static char* USER_DOCKER_BINARY_PATH = "/bin/docker"; /** * Run the command using the effective user id. @@ -923,6 +925,22 @@ void test_sanitize_docker_command() { } } +void test_get_docker_binary_path() { + char* docker_binary_null = get_docker_binary_path(NULL); + printf("Docker binary path when not set: %s\n", docker_binary_null); + if(strncmp(DEFAULT_DOCKER_BINARY_PATH, docker_binary_null, strlen(DEFAULT_DOCKER_BINARY_PATH)) != 0) { + printf("FAIL: expected output %s does not match actual output '%s'\n", DEFAULT_DOCKER_BINARY_PATH, docker_binary_null); + exit(1); + } + + char* docker_binary_set = get_docker_binary_path(USER_DOCKER_BINARY_PATH); + printf("Docker binary path when set: %s\n", docker_binary_set); + if(strncmp(USER_DOCKER_BINARY_PATH, docker_binary_set, strlen(USER_DOCKER_BINARY_PATH)) != 0) { + printf("FAIL: expected output %s does not match actual output '%s'\n", USER_DOCKER_BINARY_PATH, docker_binary_set); + exit(1); + } +} + // This test is expected to be executed either by a regular // user or by root. If executed by a regular user it doesn't // test all the functions that would depend on changing the @@ -1017,6 +1035,9 @@ int main(int argc, char **argv) { printf("\nTesting sanitize docker commands()\n"); test_sanitize_docker_command(); + printf("\nTesting get docker binary path()\n"); + test_get_docker_binary_path(); + test_check_user(0); #ifdef __APPLE__