]> git.ipfire.org Git - thirdparty/lxc.git/commitdiff
confile:add lxc.init.cwd 1992/head
authorLiFeng <lifeng68@huawei.com>
Mon, 4 Dec 2017 17:12:40 +0000 (12:12 -0500)
committerLiFeng <lifeng68@huawei.com>
Tue, 5 Dec 2017 09:18:07 +0000 (04:18 -0500)
Signed-off-by: LiFeng <lifeng68@huawei.com>
doc/lxc.container.conf.sgml.in
src/lxc/conf.c
src/lxc/conf.h
src/lxc/confile.c
src/lxc/start.c

index 51b1a7035353b87a88bb686f84442ed227587124..7df6c0eb943a5152d3d08601c857ae6ed1cbeb6a 100644 (file)
@@ -284,6 +284,26 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
       </variablelist>
     </refsect2>
 
+    <refsect2>
+      <title>Init working directory</title>
+      <para>
+        Sets the absolute path inside the container as the working directory for the containers.
+        LXC will switch to this directory before executing init.
+      </para>
+      <variablelist>
+        <varlistentry>
+          <term>
+            <option>lxc.init.cwd</option>
+          </term>
+          <listitem>
+            <para>
+              Absolute path inside the container to use as the working directory.
+            </para>
+          </listitem>
+        </varlistentry>
+      </variablelist>
+    </refsect2>
+
     <refsect2>
       <title>Init ID</title>
       <para>
index ae30b5b8726cf55cd737cba2adb2cb2e3d1c8f48..8234279f995687a35ed83cebb546f788fa353879 100644 (file)
@@ -3432,6 +3432,7 @@ void lxc_conf_free(struct lxc_conf *conf)
        free(conf->rcfile);
        free(conf->execute_cmd);
        free(conf->init_cmd);
+       free(conf->init_cwd);
        free(conf->unexpanded_config);
        free(conf->pty_names);
        free(conf->syslog);
index 58302cf30c002bc9b1412a7b1d065b0c9c83a6de..fa10a41bfa0fae0d9990fd28f6c90e98b6ae30a9 100644 (file)
@@ -359,6 +359,10 @@ struct lxc_conf {
        struct lxc_cgroup cgroup_meta;
 
        char *inherit_ns[LXC_NS_MAX];
+
+       /* init working directory */
+       char* init_cwd;
+
 };
 
 #ifdef HAVE_TLS
index a2e5ba7c1239cf3234972d9a6471ac0d02f6d53d..6bd71a0ddffda73c3c729ef5caed9210a5b9a18c 100644 (file)
@@ -95,6 +95,7 @@ lxc_config_define(hooks);
 lxc_config_define(idmaps);
 lxc_config_define(includefiles);
 lxc_config_define(init_cmd);
+lxc_config_define(init_cwd);
 lxc_config_define(init_gid);
 lxc_config_define(init_uid);
 lxc_config_define(log_file);
@@ -176,6 +177,7 @@ static struct lxc_config_t config[] = {
        { "lxc.init.cmd",                  false,                  set_config_init_cmd,                    get_config_init_cmd,                    clr_config_init_cmd,                  },
        { "lxc.init.gid",                  false,                  set_config_init_gid,                    get_config_init_gid,                    clr_config_init_gid,                  },
        { "lxc.init.uid",                  false,                  set_config_init_uid,                    get_config_init_uid,                    clr_config_init_uid,                  },
+       { "lxc.init.cwd",                  false,                  set_config_init_cwd,                    get_config_init_cwd,                    clr_config_init_cwd,                  },
        { "lxc.log.file",                  false,                  set_config_log_file,                    get_config_log_file,                    clr_config_log_file,                  },
        { "lxc.log.level",                 false,                  set_config_log_level,                   get_config_log_level,                   clr_config_log_level,                 },
        { "lxc.log.syslog",                false,                  set_config_log_syslog,                  get_config_log_syslog,                  clr_config_log_syslog,                },
@@ -945,6 +947,12 @@ static int set_config_init_cmd(const char *key, const char *value,
        return set_config_path_item(&lxc_conf->init_cmd, value);
 }
 
+static int set_config_init_cwd(const char *key, const char *value,
+                              struct lxc_conf *lxc_conf, void *data)
+{
+       return set_config_path_item(&lxc_conf->init_cwd, value);
+}
+
 static int set_config_init_uid(const char *key, const char *value,
                               struct lxc_conf *lxc_conf, void *data)
 {
@@ -3249,6 +3257,12 @@ static int get_config_init_cmd(const char *key, char *retv, int inlen,
        return lxc_get_conf_str(retv, inlen, c->init_cmd);
 }
 
+static int get_config_init_cwd(const char *key, char *retv, int inlen,
+                              struct lxc_conf *c, void *data)
+{
+       return lxc_get_conf_str(retv, inlen, c->init_cwd);
+}
+
 static int get_config_init_uid(const char *key, char *retv, int inlen,
                               struct lxc_conf *c, void *data)
 {
@@ -3665,6 +3679,14 @@ static inline int clr_config_init_cmd(const char *key, struct lxc_conf *c,
        return 0;
 }
 
+static inline int clr_config_init_cwd(const char *key, struct lxc_conf *c,
+                                     void *data)
+{
+       free(c->init_cwd);
+       c->init_cwd = NULL;
+       return 0;
+}
+
 static inline int clr_config_init_uid(const char *key, struct lxc_conf *c,
                                      void *data)
 {
index 1c47fd95ecb508987301880d58f190b1b786e880..a6bb8032570e02486fb2c064da9a1dcb2a20881e 100644 (file)
@@ -979,6 +979,11 @@ static int do_start(void *data)
 
        setsid();
 
+       if (handler->conf->init_cwd && chdir(handler->conf->init_cwd)) {
+               SYSERROR("Could not change directory to \"%s\"", handler->conf->init_cwd);
+               goto out_warn_father;
+       }
+
        if (lxc_sync_barrier_parent(handler, LXC_SYNC_CGROUP_LIMITS))
                goto out_warn_father;