Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
openeuler
isula-build
提交
d456304f
I
isula-build
项目概览
openeuler
/
isula-build
通知
5
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
I
isula-build
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
前往新版Gitcode,体验更适合开发者的 AI 搜索 >>
提交
d456304f
编写于
8月 25, 2020
作者:
X
xiadanni
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
remove: support remove by image name
Signed-off-by:
N
xiadanni
<
xiadanni1@huawei.com
>
上级
949b153e
变更
3
隐藏空白更改
内联
并排
Showing
3 changed file
with
64 addition
and
9 deletion
+64
-9
cmd/cli/remove.go
cmd/cli/remove.go
+4
-4
cmd/cli/remove_test.go
cmd/cli/remove_test.go
+4
-4
daemon/remove.go
daemon/remove.go
+56
-1
未找到文件。
cmd/cli/remove.go
浏览文件 @
d456304f
...
...
@@ -32,7 +32,7 @@ type removeOptions struct {
var
removeOpts
removeOptions
const
(
removeExample
=
`isula-build ctr-img rm <imageID>
removeExample
=
`isula-build ctr-img rm <imageID>
/<image name>
isula-build ctr-img rm --prune
isula-build ctr-img rm --all`
)
...
...
@@ -93,17 +93,17 @@ func runRemove(ctx context.Context, cli Cli, args []string) error {
func
checkArgsAndOptions
(
args
[]
string
)
error
{
if
len
(
args
)
>
0
{
if
removeOpts
.
all
{
return
errors
.
New
(
"imageID is not allowed when using --all"
)
return
errors
.
New
(
"imageID
/name
is not allowed when using --all"
)
}
if
removeOpts
.
prune
{
return
errors
.
New
(
"imageID is not allowed when using --prune"
)
return
errors
.
New
(
"imageID
/name
is not allowed when using --prune"
)
}
return
nil
}
if
!
removeOpts
.
all
&&
!
removeOpts
.
prune
{
return
errors
.
New
(
"imageID must be specified"
)
return
errors
.
New
(
"imageID
/name
must be specified"
)
}
if
removeOpts
.
all
&&
removeOpts
.
prune
{
...
...
cmd/cli/remove_test.go
浏览文件 @
d456304f
...
...
@@ -41,7 +41,7 @@ func TestRunRemove(t *testing.T) {
name
:
"test 1"
,
all
:
false
,
prune
:
false
,
errString
:
"imageID must be specified"
,
errString
:
"imageID
/name
must be specified"
,
isErr
:
true
,
},
{
...
...
@@ -75,7 +75,7 @@ func TestRunRemove(t *testing.T) {
args
:
[]
string
{
"abc"
},
all
:
false
,
prune
:
true
,
errString
:
"imageID is not allowed when using --prune"
,
errString
:
"imageID
/name
is not allowed when using --prune"
,
isErr
:
true
,
},
{
...
...
@@ -83,7 +83,7 @@ func TestRunRemove(t *testing.T) {
args
:
[]
string
{
"abc"
},
all
:
true
,
prune
:
false
,
errString
:
"imageID is not allowed when using --all"
,
errString
:
"imageID
/name
is not allowed when using --all"
,
isErr
:
true
,
},
{
...
...
@@ -91,7 +91,7 @@ func TestRunRemove(t *testing.T) {
args
:
[]
string
{
"abc"
},
all
:
true
,
prune
:
true
,
errString
:
"imageID is not allowed when using --all"
,
errString
:
"imageID
/name
is not allowed when using --all"
,
isErr
:
true
,
},
}
...
...
daemon/remove.go
浏览文件 @
d456304f
...
...
@@ -16,9 +16,12 @@ package daemon
import
(
"fmt"
"github.com/containers/storage"
"github.com/pkg/errors"
"github.com/sirupsen/logrus"
pb
"isula.org/isula-build/api/services"
"isula.org/isula-build/image"
"isula.org/isula-build/store"
)
...
...
@@ -45,7 +48,39 @@ func (b *Backend) Remove(req *pb.RemoveRequest, stream pb.Control_RemoveServer)
}
for
_
,
imageID
:=
range
rmImageIDs
{
layers
,
err
:=
s
.
DeleteImage
(
imageID
,
true
)
_
,
img
,
err
:=
image
.
FindImage
(
s
,
imageID
)
if
err
!=
nil
{
errMsg
:=
fmt
.
Sprintf
(
"Find local image %s error: %v"
,
imageID
,
err
.
Error
())
logrus
.
Error
(
errMsg
)
if
err
=
stream
.
Send
(
&
pb
.
RemoveResponse
{
LayerMessage
:
errMsg
});
err
!=
nil
{
return
err
}
continue
}
// just untag image name if it refers to multiple tags
if
len
(
img
.
Names
)
>
1
{
removed
,
uerr
:=
untagImage
(
imageID
,
s
,
img
)
if
uerr
!=
nil
{
errMsg
:=
fmt
.
Sprintf
(
"Untag image %s error: %v"
,
imageID
,
uerr
.
Error
())
logrus
.
Error
(
errMsg
)
if
err
=
stream
.
Send
(
&
pb
.
RemoveResponse
{
LayerMessage
:
errMsg
});
err
!=
nil
{
return
err
}
continue
}
if
removed
==
true
{
imageString
:=
fmt
.
Sprintf
(
"Untagged image: %v"
,
imageID
)
logrus
.
Debug
(
imageString
)
if
err
=
stream
.
Send
(
&
pb
.
RemoveResponse
{
LayerMessage
:
imageString
});
err
!=
nil
{
return
err
}
continue
}
}
layers
,
err
:=
s
.
DeleteImage
(
img
.
ID
,
true
)
if
err
!=
nil
{
// if delete failed, print out message and continue deleting the rest images
errMsg
:=
fmt
.
Sprintf
(
"Remove image %s failed: %v"
,
imageID
,
err
.
Error
())
...
...
@@ -75,6 +110,26 @@ func (b *Backend) Remove(req *pb.RemoveRequest, stream pb.Control_RemoveServer)
return
nil
}
func
untagImage
(
imageID
string
,
store
storage
.
Store
,
image
*
storage
.
Image
)
(
bool
,
error
)
{
newNames
:=
make
([]
string
,
0
,
0
)
removed
:=
false
for
_
,
imgName
:=
range
image
.
Names
{
if
imgName
==
imageID
{
removed
=
true
continue
}
newNames
=
append
(
newNames
,
imgName
)
}
if
removed
==
true
{
if
err
:=
store
.
SetNames
(
image
.
ID
,
newNames
);
err
!=
nil
{
return
false
,
errors
.
Wrapf
(
err
,
"remove name %v from image %v error"
,
imageID
,
image
.
ID
)
}
}
return
removed
,
nil
}
func
getImageIDs
(
s
store
.
Store
,
prune
bool
)
([]
string
,
error
)
{
images
,
err
:=
s
.
Images
()
if
err
!=
nil
{
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录