【问题标题】:Docker - What is proper way to rebuild and push updated image to docker cloud?Docker - 重建并将更新的图像推送到 docker 云的正确方法是什么?
【发布时间】:2016-08-11 09:29:26
【问题描述】:

我目前在做什么:

Dockerfile:

FROM python:3.5.1

ENV PYTHONUNBUFFERED 1

RUN mkdir /www
WORKDIR /www
ADD deps.txt /www/
RUN pip3 install -r deps.txt
ADD . /www/
RUN chmod 0755 /www/docker-init.sh

构建命令:

docker build -t my-djnago-app:latest .

标记:

docker tag my-djnago-app:latest lolorama/my-djnago-app-img:latest

推:

docker push lolorama/my-djnago-app-img:latest

执行这些步骤后,存储库映像仍未更新。我不断收到此消息 - “图层已存在”。

The push refers to a repository [docker.io/lolorama/my-django-app-img]
fd5aa641b308: Layer already exists
d9c60c6f98e8: Layer already exists
d9d14867f6d7: Layer already exists
64ce166099ca: Layer already exists
73b670e35c69: Layer already exists
5f70bf18a086: Layer already exists
9ea142d097a5: Layer already exists
52f5845b1de0: Layer already exists
e7fadb3ab9d4: Layer already exists
cef72744de05: Layer already exists
591569fa6c34: Layer already exists
998608e2fcd4: Layer already exists
c12ecfd4861d: Layer already exists

我做错了什么?

【问题讨论】:

  • 您是否更改了 dockerfile 中的某些内容?否则 docker build 将重建相同的图像(这会非常快,因为一切都存在)。当你推送相同的图像时,repo 将检测到所有必要的层已经存在并且会改变任何东西。
  • @lorenzvth7 Dockerfile 没有改变。我已经更改了使用 ADD . /www/ 导入的应用程序代码
  • 在更改 www/ 文件夹中的代码后,您是否重建了图像?因为那是必要的。之后,您必须标记新图像并推送。
  • @lorenzvth7 是的,我愿意..
  • 嗯,奇怪,执行 docker build(使用新的源代码)后,图像 'my-djnago-app:latest' 有多大?

标签: docker dockerfile docker-image docker-cloud


【解决方案1】:

感谢@lorenzvth7,我找到了问题!

我有两张带有相同标签的图片(我正在推送到云端)。

解决办法是:

  1. 检查您的图像并找到两个或多个具有相同标签的图像:

    docker images 
    
  2. 删除它们:

    docker rmi --force 'image id'
    
  3. 就是这样!按照我上面的问题中的步骤操作。

【讨论】:

  • 对于经常做的事情来说,这似乎真的很严厉。我觉得我们错过了一些东西。
  • 发生这种情况时,我只需重新标记我的图像并推送。有时标记不起作用?奇怪。
【解决方案2】:

另一种解决方案,尽管是蛮力的,是在再次推送之前使用 --no-cache 标志进行重建。

docker rmi --force my-djnago-app:latest

docker build -t my-djnago-app:latest . --no-cache

docker push my-djnago-app:latest

【讨论】:

    【解决方案3】:

    我也遇到了问题(In my web application),像这样:

    # when I push my contaimer to repo
    $ docker push <container>
    The push refers to repository [docker.io/xx/getting-started]
    fd5aa641b308: Layer already exists
    d9c60c6f98e8: Layer already exists
    d9d14867f6d7: Layer already exists
    64ce166099ca: Layer already exists
    73b670e35c69: Layer already exists
    5f70bf18a086: Layer already exists
    9ea142d097a5: Layer already exists
    52f5845b1de0: Layer already exists
    

    我尝试了我的解决方案,它的工作原理!

    # force remove image
    $ docker rmi --force <image-id>
    # tag for image
    $ docker tag <image-name> <your-dockerHub-username>/<image-name>
    # push image, just done!
    $ docker push <your-user-name>/<image-name>
    

    终端输出:

    # when I push my container to repo
    $ docker push <container>
    The push refers to repository [docker.io/xx/getting-started]
    # it'll push your part of changes
    fd5aa641b308: Pushed
    d9c60c6f98e8: Pushed
    d9d14867f6d7: Layer already exists
    64ce166099ca: Layer already exists
    73b670e35c69: Layer already exists
    5f70bf18a086: Layer already exists
    9ea142d097a5: Layer already exists
    52f5845b1de0: Layer already exists
    

    然后,打开my web appliction,它更新了最新版本!

    【讨论】:

    • 你好。最好以 Text 模式复制日志。这有助于索引和搜索,并且有相同问题的用户可以更快地到达这里。坦克
    猜你喜欢
    • 1970-01-01
    • 2020-11-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-04
    • 2022-01-10
    相关资源
    最近更新 更多