是否有不依赖映像ID的docker映像标记

时间:2019-06-10 08:18:20

标签: docker

我有带有多个标签的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正在使用映像

2 个答案:

答案 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将清除带有标签但没有正在运行的容器的图像,假定它们始终可以从存储库中重建或再次拉出。