我有带有多个标签的docker环境。
赞:
class App extends React.Component {
constructor(props) {
super(props);
this.state = {
data: [],
library: null,
NewAmount: '',
NewSign: '',
};
}
componentDidMount() {
fetch('/json.bc', {
method: 'POST',
})
.then(response => response.text())
.then(text => {
const Maindata = JSON.parse(text.replace(/\'/g, '"'));
this.setState(
state => ({
...state,
data: Maindata,
}),
() => {
this.reorganiseLibrary();
},
);
})
.catch(error => console.error(error));
}
reorganiseLibrary = () => {
const { data } = this.state;
let library = data;
library = _.chunk(library);
this.setState({ library });
};
handlePerPage = evt => {
this.setState(
{
perPage: evt.target.value,
},
() => this.reorganiseLibrary(),
);
};
// handle render of library
renderLibrary = () => {
const { library } = this.state;
if (!library || (library && library.length === 0)) {
return <div className="nodata">No data</div>;
}
return library.map((item, i) => (
<div>
<span className="Total-Price">
{this.renderTotal(item, this.state.NewAmount, this.state.NewSign)}
</span>
</div>
));
};
render() {
const { library } = this.state;
return (
<div>
{this.renderLibrary()}
<button
onClick={e =>
this.ChangePrice(e, this.renderChangePrice(element), this.renderSignPrice(element))
}
>
Select
</button>
</div>
);
}
renderTotal(element, NewAmount, NewSign) {
let Total = element.total;
if (NewAmount == '') {
return new Intl.NumberFormat().format(Total);
} else {
if (NewSign == '+') {
return Total + NewAmount;
} else {
return Total - NewAmount;
}
}
}
renderChangePrice(element) {
let SliceElementNumber = parseInt(element.substr(1));
return parseInt(SliceElementNumber);
}
renderSignPrice(element) {
let SliceElementSign = NewSign.slice(0, 1);
return SliceElementSign;
}
ChangePrice = (e, elem, elemSign) =>
this.setState(
{
NewAmount: parseInt((this.state.NewAmount || 0) + elem),
NewSign: elemSign,
},
() => {
this.reorganiseLibrary();
},
);
}
ReactDOM.render(<App />, document.getElementById('Result'));
在这种情况下,我必须删除一个带标签的环境,因为它们使用相同的图像ID。如何通过标签更改图像ID?
image01:dev - > image01:staging - > image01:Prod
image02:dev - > image01:staging - > image01:Prod
我得到这些错误:
守护程序的错误响应:冲突:无法删除3637565c5b84(无法强制执行)-正在运行容器67692aab8b26使用图像
守护程序的错误响应:冲突:无法删除60892921e72f(无法强制执行)-正在运行容器4be9a7ee6d0d使用图像
守护程序的错误响应:冲突:无法删除8289f92814de(无法强制执行)-正在运行容器b06fb2e8b8a8使用图像
来自守护程序的错误响应:冲突:无法删除b2c5303a61cb(无法强制执行)-正在运行容器550f14f5d8d3使用图像
守护程序的错误响应:冲突:无法删除db95989f3c68(无法强制执行)-正在运行容器3752ae226b9e容器正在使用映像
守护程序的错误响应:冲突:无法删除6f2a973fcb00(无法强制执行)-正在运行容器e0b92afc05c2正在使用映像
答案 0 :(得分:0)
在删除它之前,您需要查看您是否在某些状态下正在使用这些图像的容器。
var request = new HttpRequestMessage(HttpMethod.Post, "customers")
{
Content = new StringContent(JsonConvert.SerializeObject(customer), Encoding.UTF8, "application/json")
};
request.Headers.Authorization = new AuthenticationHeaderValue("Basic", authValue);
HttpResponseMessage result = client.SendAsync(request).Result;
您可以看到尚未完全停止的容器,并使用容器ID制作docker ps -a
,然后在完成该过程后,尝试再次删除图像。
答案 1 :(得分:0)
与正在运行的容器无关,您可以使用docker tag
命令将标签分配给其他图像。
docker tag image01:dev image01:staging
# Now "dev" and "staging" point at the same image
然后您需要停止,删除和重新启动容器以使用新映像运行它们
docker stop staging
docker rm staging
docker run --name staging ... image01:staging
这将导致没有标签且没有运行容器的“悬挂”图像。你可以清理这些
docker image prune -f
请注意,在许多集群环境中,标签的字面名称是一个重要的标识符,因此您不应重复使用这样的标签名称。例如,在Kubernetes中,触发Deployment对象的零停机滚动升级非常容易,但前提是要更改部署配置的某些文本方面。使它使用相同图像标签的较新版本重新启动Deployment变得非常困难。我建议使用诸如源代码控件提交ID或日期戳之类的标记名称,然后直接运行
docker run --name staging ... image01:20190610
docker image prune -a
将清除带有标签但没有正在运行的容器的图像,假定它们始终可以从存储库中重建或再次拉出。