mirror of
https://github.com/containers/fuse-overlayfs.git
synced 2025-08-04 02:15:58 -04:00
Revert "main: add helper function to get fd to the upper layer"
This reverts commit b4ef7a8fff0a76ac05dccb59edbbb49971b76420. Closes: https://github.com/containers/fuse-overlayfs/issues/86 Signed-off-by: Giuseppe Scrivano <gscrivan@redhat.com>
This commit is contained in:
parent
1ff7c64d2f
commit
9adc80c31b
66
main.c
66
main.c
@ -404,12 +404,6 @@ node_dirfd (struct ovl_node *n)
|
|||||||
return n->layer->fd;
|
return n->layer->fd;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int
|
|
||||||
upper_layer_fd (struct ovl_data *lo)
|
|
||||||
{
|
|
||||||
return lo->layers->fd;
|
|
||||||
}
|
|
||||||
|
|
||||||
static bool
|
static bool
|
||||||
has_prefix (const char *str, const char *pref)
|
has_prefix (const char *str, const char *pref)
|
||||||
{
|
{
|
||||||
@ -527,7 +521,7 @@ create_whiteout (struct ovl_data *lo, struct ovl_node *parent, const char *name,
|
|||||||
ret = asprintf (&whiteout_path, "%s/%s", parent->path, name);
|
ret = asprintf (&whiteout_path, "%s/%s", parent->path, name);
|
||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
return ret;
|
return ret;
|
||||||
ret = mknodat (upper_layer_fd (lo), whiteout_path, S_IFCHR|0700, makedev (0, 0));
|
ret = mknodat (get_upper_layer (lo)->fd, whiteout_path, S_IFCHR|0700, makedev (0, 0));
|
||||||
if (ret == 0)
|
if (ret == 0)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
@ -541,7 +535,7 @@ create_whiteout (struct ovl_data *lo, struct ovl_node *parent, const char *name,
|
|||||||
ret = asprintf (&whiteout_wh_path, "%s/.wh.%s", parent->path, name);
|
ret = asprintf (&whiteout_wh_path, "%s/.wh.%s", parent->path, name);
|
||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
return ret;
|
return ret;
|
||||||
fd = TEMP_FAILURE_RETRY (openat (upper_layer_fd (lo), whiteout_wh_path, O_CREAT|O_WRONLY|O_NONBLOCK, 0700));
|
fd = TEMP_FAILURE_RETRY (openat (get_upper_layer (lo)->fd, whiteout_wh_path, O_CREAT|O_WRONLY|O_NONBLOCK, 0700));
|
||||||
if (fd < 0 && errno != EEXIST)
|
if (fd < 0 && errno != EEXIST)
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
@ -573,12 +567,12 @@ delete_whiteout (struct ovl_data *lo, int dirfd, struct ovl_node *parent, const
|
|||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
return ret;
|
return ret;
|
||||||
|
|
||||||
if (TEMP_FAILURE_RETRY (fstatat (upper_layer_fd (lo), whiteout_path, &st, AT_SYMLINK_NOFOLLOW)) == 0
|
if (TEMP_FAILURE_RETRY (fstatat (get_upper_layer (lo)->fd, whiteout_path, &st, AT_SYMLINK_NOFOLLOW)) == 0
|
||||||
&& (st.st_mode & S_IFMT) == S_IFCHR
|
&& (st.st_mode & S_IFMT) == S_IFCHR
|
||||||
&& major (st.st_rdev) == 0
|
&& major (st.st_rdev) == 0
|
||||||
&& minor (st.st_rdev) == 0)
|
&& minor (st.st_rdev) == 0)
|
||||||
{
|
{
|
||||||
if (unlinkat (upper_layer_fd (lo), whiteout_path, 0) < 0)
|
if (unlinkat (get_upper_layer (lo)->fd, whiteout_path, 0) < 0)
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -606,7 +600,7 @@ delete_whiteout (struct ovl_data *lo, int dirfd, struct ovl_node *parent, const
|
|||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
return ret;
|
return ret;
|
||||||
|
|
||||||
if (unlinkat (upper_layer_fd (lo), whiteout_path, 0) < 0 && errno != ENOENT)
|
if (unlinkat (get_upper_layer (lo)->fd, whiteout_path, 0) < 0 && errno != ENOENT)
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -632,7 +626,7 @@ hide_node (struct ovl_data *lo, struct ovl_node *node, bool unlink_src)
|
|||||||
if (unlink_src)
|
if (unlink_src)
|
||||||
{
|
{
|
||||||
/* If the atomic rename+mknod failed, then fallback into doing it in two steps. */
|
/* If the atomic rename+mknod failed, then fallback into doing it in two steps. */
|
||||||
if (syscall (SYS_renameat2, upper_layer_fd (lo), node->path, lo->workdir_fd,
|
if (syscall (SYS_renameat2, node_dirfd (node), node->path, lo->workdir_fd,
|
||||||
newpath, RENAME_WHITEOUT) < 0)
|
newpath, RENAME_WHITEOUT) < 0)
|
||||||
{
|
{
|
||||||
if (node->parent)
|
if (node->parent)
|
||||||
@ -643,7 +637,7 @@ hide_node (struct ovl_data *lo, struct ovl_node *node, bool unlink_src)
|
|||||||
if (create_whiteout (lo, node->parent, node->name, true, false) < 0)
|
if (create_whiteout (lo, node->parent, node->name, true, false) < 0)
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
if (renameat (upper_layer_fd (lo), node->path, lo->workdir_fd, newpath) < 0)
|
if (renameat (node_dirfd (node), node->path, lo->workdir_fd, newpath) < 0)
|
||||||
{
|
{
|
||||||
if (node->parent)
|
if (node->parent)
|
||||||
{
|
{
|
||||||
@ -653,7 +647,7 @@ hide_node (struct ovl_data *lo, struct ovl_node *node, bool unlink_src)
|
|||||||
/* If the rename failed, then try to delete the whiteout file we
|
/* If the rename failed, then try to delete the whiteout file we
|
||||||
created earlier. */
|
created earlier. */
|
||||||
if (ret == 0)
|
if (ret == 0)
|
||||||
unlinkat (upper_layer_fd (lo), whpath, 0);
|
unlinkat (get_upper_layer (lo)->fd, whpath, 0);
|
||||||
}
|
}
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
@ -1977,7 +1971,7 @@ create_node_directory (struct ovl_data *lo, struct ovl_node *src)
|
|||||||
times[0] = st.st_atim;
|
times[0] = st.st_atim;
|
||||||
times[1] = st.st_mtim;
|
times[1] = st.st_mtim;
|
||||||
|
|
||||||
ret = create_directory (lo, upper_layer_fd (lo), src->path, times, src->parent, sfd, st.st_uid, st.st_gid, st.st_mode);
|
ret = create_directory (lo, get_upper_layer (lo)->fd, src->path, times, src->parent, sfd, st.st_uid, st.st_gid, st.st_mode);
|
||||||
if (ret == 0)
|
if (ret == 0)
|
||||||
{
|
{
|
||||||
src->layer = get_upper_layer (lo);
|
src->layer = get_upper_layer (lo);
|
||||||
@ -2077,7 +2071,7 @@ copyup (struct ovl_data *lo, struct ovl_node *node)
|
|||||||
p = new;
|
p = new;
|
||||||
}
|
}
|
||||||
p[ret] = '\0';
|
p[ret] = '\0';
|
||||||
ret = symlinkat (p, upper_layer_fd (lo), node->path);
|
ret = symlinkat (p, get_upper_layer (lo)->fd, node->path);
|
||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
goto exit;
|
goto exit;
|
||||||
goto success;
|
goto success;
|
||||||
@ -2151,7 +2145,7 @@ copyup (struct ovl_data *lo, struct ovl_node *node)
|
|||||||
goto exit;
|
goto exit;
|
||||||
|
|
||||||
/* Finally, move the file to its destination. */
|
/* Finally, move the file to its destination. */
|
||||||
ret = renameat (lo->workdir_fd, wd_tmp_file_name, upper_layer_fd (lo), node->path);
|
ret = renameat (lo->workdir_fd, wd_tmp_file_name, get_upper_layer (lo)->fd, node->path);
|
||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
goto exit;
|
goto exit;
|
||||||
|
|
||||||
@ -2162,7 +2156,7 @@ copyup (struct ovl_data *lo, struct ovl_node *node)
|
|||||||
ret = asprintf (&whpath, "%s/.wh.%s", node->parent->path, node->name);
|
ret = asprintf (&whpath, "%s/.wh.%s", node->parent->path, node->name);
|
||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
goto exit;
|
goto exit;
|
||||||
if (unlinkat (upper_layer_fd (lo), whpath, 0) < 0 && errno != ENOENT)
|
if (unlinkat (get_upper_layer (lo)->fd, whpath, 0) < 0 && errno != ENOENT)
|
||||||
goto exit;
|
goto exit;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2260,7 +2254,7 @@ empty_dir (struct ovl_data *lo, struct ovl_node *node)
|
|||||||
cleanup_close int cleanup_fd = -1;
|
cleanup_close int cleanup_fd = -1;
|
||||||
struct dirent *dent;
|
struct dirent *dent;
|
||||||
|
|
||||||
cleanup_fd = TEMP_FAILURE_RETRY (openat (upper_layer_fd (lo), node->path, O_DIRECTORY));
|
cleanup_fd = TEMP_FAILURE_RETRY (openat (get_upper_layer (lo)->fd, node->path, O_DIRECTORY));
|
||||||
if (cleanup_fd < 0)
|
if (cleanup_fd < 0)
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
@ -2440,7 +2434,7 @@ ovl_setxattr (fuse_req_t req, fuse_ino_t ino, const char *name,
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
fd = TEMP_FAILURE_RETRY (openat (upper_layer_fd (lo), node->path, O_NONBLOCK));
|
fd = TEMP_FAILURE_RETRY (openat (node_dirfd (node), node->path, O_NONBLOCK));
|
||||||
if (fd < 0)
|
if (fd < 0)
|
||||||
{
|
{
|
||||||
fuse_reply_err (req, errno);
|
fuse_reply_err (req, errno);
|
||||||
@ -2480,7 +2474,7 @@ ovl_removexattr (fuse_req_t req, fuse_ino_t ino, const char *name)
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
fd = TEMP_FAILURE_RETRY (openat (upper_layer_fd (lo), node->path, O_NONBLOCK));
|
fd = TEMP_FAILURE_RETRY (openat (node_dirfd (node), node->path, O_NONBLOCK));
|
||||||
if (fd < 0)
|
if (fd < 0)
|
||||||
{
|
{
|
||||||
fuse_reply_err (req, errno);
|
fuse_reply_err (req, errno);
|
||||||
@ -2568,13 +2562,13 @@ ovl_do_open (fuse_req_t req, fuse_ino_t parent, const char *name, int flags, mod
|
|||||||
unlinkat (lo->workdir_fd, wd_tmp_file_name, 0);
|
unlinkat (lo->workdir_fd, wd_tmp_file_name, 0);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
if (unlinkat (upper_layer_fd (lo), path, 0) < 0 && errno != ENOENT)
|
if (unlinkat (get_upper_layer (lo)->fd, path, 0) < 0 && errno != ENOENT)
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
if (delete_whiteout (lo, -1, p, name) < 0)
|
if (delete_whiteout (lo, -1, p, name) < 0)
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
if (renameat (lo->workdir_fd, wd_tmp_file_name, upper_layer_fd (lo), path) < 0)
|
if (renameat (lo->workdir_fd, wd_tmp_file_name, get_upper_layer (lo)->fd, path) < 0)
|
||||||
{
|
{
|
||||||
unlinkat (lo->workdir_fd, wd_tmp_file_name, 0);
|
unlinkat (lo->workdir_fd, wd_tmp_file_name, 0);
|
||||||
return -1;
|
return -1;
|
||||||
@ -2608,7 +2602,7 @@ ovl_do_open (fuse_req_t req, fuse_ino_t parent, const char *name, int flags, mod
|
|||||||
if (n == NULL)
|
if (n == NULL)
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
return TEMP_FAILURE_RETRY (openat (upper_layer_fd (lo), n->path, flags, mode));
|
return TEMP_FAILURE_RETRY (openat (node_dirfd (n), n->path, flags, mode));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2786,7 +2780,7 @@ ovl_setattr (fuse_req_t req, fuse_ino_t ino, struct stat *attr, int to_set, stru
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
dirfd = upper_layer_fd (lo);
|
dirfd = node_dirfd (node);
|
||||||
|
|
||||||
if (TEMP_FAILURE_RETRY (fstatat (dirfd, node->path, &old_st, AT_SYMLINK_NOFOLLOW)) < 0)
|
if (TEMP_FAILURE_RETRY (fstatat (dirfd, node->path, &old_st, AT_SYMLINK_NOFOLLOW)) < 0)
|
||||||
{
|
{
|
||||||
@ -2944,20 +2938,20 @@ ovl_link (fuse_req_t req, fuse_ino_t ino, fuse_ino_t newparent, const char *newn
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (linkat (upper_layer_fd (lo), node->path, lo->workdir_fd, wd_tmp_file_name, 0) < 0)
|
if (linkat (node_dirfd (newparentnode), node->path, lo->workdir_fd, wd_tmp_file_name, 0) < 0)
|
||||||
{
|
{
|
||||||
fuse_reply_err (req, errno);
|
fuse_reply_err (req, errno);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (renameat (lo->workdir_fd, wd_tmp_file_name, upper_layer_fd (lo), path) < 0)
|
if (renameat (lo->workdir_fd, wd_tmp_file_name, node_dirfd (newparentnode), path) < 0)
|
||||||
{
|
{
|
||||||
fuse_reply_err (req, errno);
|
fuse_reply_err (req, errno);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
cleanup_close int dfd = TEMP_FAILURE_RETRY (openat (upper_layer_fd (lo), path, O_WRONLY|O_NONBLOCK));
|
cleanup_close int dfd = TEMP_FAILURE_RETRY (openat (node_dirfd (newparentnode), path, O_WRONLY|O_NONBLOCK));
|
||||||
if (dfd >= 0)
|
if (dfd >= 0)
|
||||||
{
|
{
|
||||||
bool set = false;
|
bool set = false;
|
||||||
@ -3078,7 +3072,7 @@ ovl_symlink (fuse_req_t req, const char *link, fuse_ino_t parent, const char *na
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
ret = renameat (lo->workdir_fd, wd_tmp_file_name, upper_layer_fd (lo), path);
|
ret = renameat (lo->workdir_fd, wd_tmp_file_name, get_upper_layer (lo)->fd, path);
|
||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
{
|
{
|
||||||
fuse_reply_err (req, errno);
|
fuse_reply_err (req, errno);
|
||||||
@ -3160,7 +3154,7 @@ ovl_rename_exchange (fuse_req_t req, fuse_ino_t parent, const char *name,
|
|||||||
if (pnode == NULL)
|
if (pnode == NULL)
|
||||||
goto error;
|
goto error;
|
||||||
|
|
||||||
ret = TEMP_FAILURE_RETRY (openat (upper_layer_fd (lo), pnode->path, O_DIRECTORY));
|
ret = TEMP_FAILURE_RETRY (openat (node_dirfd (pnode), pnode->path, O_DIRECTORY));
|
||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
goto error;
|
goto error;
|
||||||
srcfd = ret;
|
srcfd = ret;
|
||||||
@ -3169,7 +3163,7 @@ ovl_rename_exchange (fuse_req_t req, fuse_ino_t parent, const char *name,
|
|||||||
if (destpnode == NULL)
|
if (destpnode == NULL)
|
||||||
goto error;
|
goto error;
|
||||||
|
|
||||||
ret = TEMP_FAILURE_RETRY (openat (upper_layer_fd (lo), destpnode->path, O_DIRECTORY));
|
ret = TEMP_FAILURE_RETRY (openat (node_dirfd (destpnode), destpnode->path, O_DIRECTORY));
|
||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
goto error;
|
goto error;
|
||||||
destfd = ret;
|
destfd = ret;
|
||||||
@ -3292,7 +3286,7 @@ ovl_rename_direct (fuse_req_t req, fuse_ino_t parent, const char *name,
|
|||||||
if (pnode == NULL)
|
if (pnode == NULL)
|
||||||
goto error;
|
goto error;
|
||||||
|
|
||||||
ret = TEMP_FAILURE_RETRY (openat (upper_layer_fd (lo), pnode->path, O_DIRECTORY));
|
ret = TEMP_FAILURE_RETRY (openat (node_dirfd (pnode), pnode->path, O_DIRECTORY));
|
||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
goto error;
|
goto error;
|
||||||
srcfd = ret;
|
srcfd = ret;
|
||||||
@ -3301,7 +3295,7 @@ ovl_rename_direct (fuse_req_t req, fuse_ino_t parent, const char *name,
|
|||||||
if (destpnode == NULL)
|
if (destpnode == NULL)
|
||||||
goto error;
|
goto error;
|
||||||
|
|
||||||
ret = TEMP_FAILURE_RETRY (openat (upper_layer_fd (lo), destpnode->path, O_DIRECTORY));
|
ret = TEMP_FAILURE_RETRY (openat (node_dirfd (destpnode), destpnode->path, O_DIRECTORY));
|
||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
goto error;
|
goto error;
|
||||||
destfd = ret;
|
destfd = ret;
|
||||||
@ -3466,7 +3460,7 @@ ovl_statfs (fuse_req_t req, fuse_ino_t ino)
|
|||||||
if (ovl_debug (req))
|
if (ovl_debug (req))
|
||||||
fprintf (stderr, "ovl_statfs(ino=%" PRIu64 "s)\n", ino);
|
fprintf (stderr, "ovl_statfs(ino=%" PRIu64 "s)\n", ino);
|
||||||
|
|
||||||
ret = fstatvfs (upper_layer_fd (lo), &sfs);
|
ret = fstatvfs (get_upper_layer (lo)->fd, &sfs);
|
||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
{
|
{
|
||||||
fuse_reply_err (req, errno);
|
fuse_reply_err (req, errno);
|
||||||
@ -3624,7 +3618,7 @@ ovl_mknod (fuse_req_t req, fuse_ino_t parent, const char *name, mode_t mode, dev
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
ret = renameat (lo->workdir_fd, wd_tmp_file_name, upper_layer_fd (lo), path);
|
ret = renameat (lo->workdir_fd, wd_tmp_file_name, get_upper_layer (lo)->fd, path);
|
||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
{
|
{
|
||||||
fuse_reply_err (req, errno);
|
fuse_reply_err (req, errno);
|
||||||
@ -3710,7 +3704,7 @@ ovl_mkdir (fuse_req_t req, fuse_ino_t parent, const char *name, mode_t mode)
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
ret = create_directory (lo, upper_layer_fd (lo), path, NULL, pnode, -1,
|
ret = create_directory (lo, get_upper_layer (lo)->fd, path, NULL, pnode, -1,
|
||||||
get_uid (lo, ctx->uid), get_gid (lo, ctx->gid), mode & ~ctx->umask);
|
get_uid (lo, ctx->uid), get_gid (lo, ctx->gid), mode & ~ctx->umask);
|
||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
{
|
{
|
||||||
|
@ -6,7 +6,7 @@ mkdir lower upper workdir merged
|
|||||||
|
|
||||||
fuse-overlayfs -o lowerdir=lower,upperdir=upper,workdir=workdir,suid,dev merged
|
fuse-overlayfs -o lowerdir=lower,upperdir=upper,workdir=workdir,suid,dev merged
|
||||||
|
|
||||||
docker run --rm -ti -v merged:/merged fedora dnf --installroot /merged --releasever 30 install -y glibc-common gedit
|
docker run --rm -ti -v $(pwd)/merged:/merged fedora dnf --installroot /merged --releasever 30 install -y glibc-common gedit
|
||||||
|
|
||||||
umount merged
|
umount merged
|
||||||
|
|
||||||
@ -18,11 +18,23 @@ mkdir upper workdir
|
|||||||
fuse-overlayfs -o lowerdir=lower,upperdir=upper,workdir=workdir,suid,dev merged
|
fuse-overlayfs -o lowerdir=lower,upperdir=upper,workdir=workdir,suid,dev merged
|
||||||
|
|
||||||
# Install some big packages
|
# Install some big packages
|
||||||
docker run --rm -ti -v merged:/merged fedora dnf --installroot /merged --releasever 30 install -y emacs texlive
|
docker run --rm -ti -v $(pwd)/merged:/merged fedora dnf --installroot /merged --releasever 30 install -y emacs texlive
|
||||||
|
|
||||||
docker run --rm -ti -v merged:/merged fedora sh -c 'rm /merged/usr/share/glib-2.0/schemas/gschemas.compiled; glib-compile-schemas /merged/usr/share/glib-2.0/schemas/'
|
docker run --rm -ti -v $(pwd)/merged:/merged fedora sh -c 'rm /merged/usr/share/glib-2.0/schemas/gschemas.compiled; glib-compile-schemas /merged/usr/share/glib-2.0/schemas/'
|
||||||
|
|
||||||
umount merged
|
umount merged
|
||||||
fuse-overlayfs -o lowerdir=lower,upperdir=upper,workdir=workdir,suid,dev merged
|
fuse-overlayfs -o lowerdir=lower,upperdir=upper,workdir=workdir,suid,dev merged
|
||||||
|
|
||||||
docker run --rm -ti -v merged:/merged fedora sh -c 'rm -rf /merged/usr/share/glib-2.0/'
|
docker run --rm -ti -v $(pwd)/merged:/merged fedora sh -c 'rm -rf /merged/usr/share/glib-2.0/'
|
||||||
|
|
||||||
|
|
||||||
|
umount merged
|
||||||
|
rm -rf workdir lower upper
|
||||||
|
mkdir upper workdir lower
|
||||||
|
|
||||||
|
fuse-overlayfs -o lowerdir=lower,upperdir=upper,workdir=workdir,suid,dev merged
|
||||||
|
|
||||||
|
# https://github.com/containers/fuse-overlayfs/issues/86
|
||||||
|
docker run --rm -ti -v $(pwd)/merged:/merged centos:6 yum --installroot /merged -y --releasever 6 install https://dl.fedoraproject.org/pub/epel/epel-release-latest-6.noarch.rpm
|
||||||
|
|
||||||
|
umount merged
|
||||||
|
Loading…
x
Reference in New Issue
Block a user