【问题标题】:Docker creating multiple imagesDocker 创建多个镜像
【发布时间】:2018-03-02 03:24:11
【问题描述】:

我是 Docker 新手,发现正在创建大量图像(如在 sudo docker images 中看到的)并在 stackoverflow 中的某处找到定期运行 sudo docker rmi $(sudo docker images -q) 以删除所有图像。为什么会创建这么多图像?我的配置有问题吗?

docker-compose.yml

nginx:
  build: ./nginx
  restart: always
  ports:
    - "80:80"
    - "443:443"
  volumes:
    - /etc/letsencrypt/:/etc/letsencrypt/
  links:
    - node:node

node:
  build: ./node
  restart: always
  ports:
   - "8080:8080"
  volumes:
    - ./node:/usr/src/app
    - /usr/src/app/node_modules

nginx dockerfile 是

FROM nginx:alpine

COPY nginx.conf /etc/nginx/conf.d/default.conf

nodejs dockerfile 是

FROM node:9.3.0-alpine

WORKDIR /usr/src/app

COPY package*.json /usr/src/app/

RUN npm install --only=production

COPY . /usr/src/app

EXPOSE 8080
CMD [ "npm", "start" ]

网站/应用程序运行良好。除了定期,我将删除所有容器、图像,然后运行:sudo docker-compose up --build -d

【问题讨论】:

    标签: docker docker-compose dockerfile


    【解决方案1】:

    图像是不可变的,因此您所做的任何更改都会导致创建一个新图像。由于您的 compose 文件指定了构建命令,因此它会在您启动容器时重新运行构建命令。如果您使用COPYADD 包含的任何文件发生更改,则不再使用现有的图像缓存,它将构建一个新图像而不删除旧图像。

    请注意,我建议您在撰写文件中命名您的图像,以便清楚地知道正在重建哪个图像。并且您可以观看 compose 构建输出到不使用缓存报告的第一步以查看发生了什么变化。如果我猜的话,破坏缓存并导致新图像的行是 nodejs 中的这一行:

    COPY . /usr/src/app
    

    如果您的容器中不需要正在更改并导致重建的文件,则使用.dockerignore 文件排除不必要的文件。

    【讨论】:

    • BMitch。谢谢。我认为,复制命令的原因是因为应用程序(特定于应用程序的 nodejs 文件)会不断变化。不是吗?我的理解是图像是核心节点js。我有.gitignore,它没有标准的东西同步节点模块。
    • @Raj 您运行一个构建在 nodejs 图像之上的图像。每次更改代码后,它将使用新内容重新创建。
    • 这不是 Node docker 文件在做什么。在程序中进行更改并将其复制到容器的卷中。同样,我的理解是 compose.yml 中指定的体积在图像外部。对?因此,无论如何,更新都与图像无关。原因,我要问的是该站点目前仅用于测试,我可能会在月底前投入生产。因此想掌握 Dockers。再次感谢您的及时回复
    • @Raj compose 文件中的卷将覆盖您在使用 Dockerfile 完成的映像构建中运行的 COPY。这是在开发环境中进行快速迭代的常见做法,但每次运行新构建时,都会得到一个新映像。如果您只更改了该主机卷的内容,并且您只需要在本地查看它们,那么您可以跳过构建以避免创建另一个映像。
    • @Raj 一旦你退出开发,你将重建镜像,推送构建的镜像。当您在生产中运行它时,您将删除该卷挂载。结果是您的代码将嵌入到部署的映像中。
    【解决方案2】:

    我在构建 Dockerfile 时遇到了同样的问题。

    我找到了解决方案,使用这个命令来构建你的文件:

    `docker build --rm -t <tag> .`
    

    选项--rm 在成功构建后删除中间容器。

    【讨论】:

      【解决方案3】:

      不应该创建“这么多图像”。

      如果你想确保只保留你需要的那个(不必每次都重新构建);简单地做(如I detail here):

      docker image prune
      

      【讨论】:

      • 感谢 VonC。我会定期执行一组类似的命令。停止所有容器。移除所有容器。删除所有图像。修剪所有图像。移除所有悬挂的容器等。这是通过其中一项建议。我的基本问题是为什么我必须这样做?以及是否是因为我设置 Docker 的一些错误方式。在我看来,定期这样做是没有意义的。
      • @Raj 注意:您所描述的是在一个命令中完成的:docker system prune
      猜你喜欢
      • 1970-01-01
      • 2015-08-25
      • 1970-01-01
      • 1970-01-01
      • 2019-08-03
      • 1970-01-01
      • 1970-01-01
      • 2017-09-29
      • 2017-11-04
      相关资源
      最近更新 更多