cgo setns + libcontainer nsexec

https://www.jianshu.com/p/c48e6cd84ff5

nsenter/nsenter.go

1、怎么获取mydocker_pid 

2、怎么获取mydocker_cmd

package nsenter

/*
#include <errno.h>
#include <sched.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <fcntl.h>

__attribute__((constructor)) void enter_namespace(void) {
    char *mydocker_pid;
    mydocker_pid = getenv("mydocker_pid");
    if (mydocker_pid) {
        fprintf(stdout, "got mydocker_pid=%s
", mydocker_pid);
    } else {
        fprintf(stdout, "missing mydocker_pid env skip nsenter");
        return;
    }
    char *mydocker_cmd;
    mydocker_cmd = getenv("mydocker_cmd");
    if (mydocker_cmd) {
        fprintf(stdout, "got mydocker_cmd=%s
", mydocker_cmd);
    } else {
        fprintf(stdout, "missing mydocker_cmd env skip nsenter");
        return;
    }
    int i;
    char nspath[1024];
    char *namespaces[] = { "ipc", "uts", "net", "pid", "mnt" };

    for (i=0; i<5; i++) {
        sprintf(nspath, "/proc/%s/ns/%s", mydocker_pid, namespaces[i]);
        int fd = open(nspath, O_RDONLY);

        if (setns(fd, 0) == -1) {
            fprintf(stderr, "setns on %s namespace failed: %s
", namespaces[i], strerror(errno));
        } else {
            fprintf(stdout, "setns on %s namespace succeeded
", namespaces[i]);
        }
        close(fd);
    }
    int res = system(mydocker_cmd);
    exit(0);
    return;
}
*/
import "C
原文地址:https://www.cnblogs.com/dream397/p/14086881.html