Docker镜像没有更新。

4
我想构建一个镜像并运行容器,但在对代码进行一些更改后,我使用以下命令重新构建镜像并运行容器:docker-compose up --build。但是在Docker桌面应用程序中的镜像列表中,我看到的是大约6小时前创建的图像,而我只是在2分钟前进行了操作。 我经常在重新构建之前删除Docker桌面应用程序中的镜像,但我看到这种行为没有改变。 唯一的出路是在重建3-5个图像后完全重新安装Docker桌面应用程序,但这太疯狂了! 问题出在哪里?是缓存的原因吗? 这是我的docker-compose文件内容。
    version: '3'
services:
  attachment-loader-prim:
    container_name: attachment-loader
    build:
      context: ""
    restart: always
    image: attachment-loader:latest
    environment:
      SPRING_PROFILES_ACTIVE: "prim"
      LOGGING_LEVEL_ORG_HIBERNATE_SQL: DEBUG
      LOGGING_LEVEL_ORG_HIBERNATE_TYPE_DESCRIPTOR_SQL_BASICBINDER: TRACE
    networks:
      - loader-network
    ports:
      - 8005:8005
      - 8085:8085
      
  attachment-loader-sec:
    container_name: attachment-loader-sec
    build:
      context: ""
    restart: always
    image: attachment-loader:latest
    environment:
      SPRING_PROFILES_ACTIVE: "sec"
      LOGGING_LEVEL_ORG_HIBERNATE_SQL: DEBUG
      LOGGING_LEVEL_ORG_HIBERNATE_TYPE_DESCRIPTOR_SQL_BASICBINDER: TRACE
    networks:
      - loader-network
    ports:
      - 8006:8005
      - 8086:8086

networks:
  loader-network:
    attachable: true

这是我的 Dockerfile 文件

    FROM adoptopenjdk/openjdk11:alpine-jre
VOLUME /tmp
ARG TZ='Europe/Berlin'

RUN sed -i 's/dl-cdn.alpinelinux.org/uk.alpinelinux.org/' /etc/apk/repositories
RUN apk upgrade --update \
    && apk add -U tzdata curl jq \
    && cp /usr/share/zoneinfo/${TZ} /etc/localtime \
    && apk del tzdata \
    && rm -rf \
    /var/cache/apk/*
RUN echo ${TZ} > /etc/timezone

ARG DEPENDENCY=build/dependency
COPY ${DEPENDENCY}/BOOT-INF/lib /app/lib
COPY ${DEPENDENCY}/META-INF /app/META-INF
COPY ${DEPENDENCY}/BOOT-INF/classes /app
ENTRYPOINT ["java","-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=*:8005","-cp","app:app/lib/*","com.path.to.your.Application.kt"]

请编辑该帖子并添加[MRE]。如果我忘记--build标志,则会遇到这个问题。当我包括--build标志时,我从未遇到过这种行为。 - Turing85
从一个干净的 Docker 实例开始构建你的镜像。尝试运行 docker image ls 命令,然后修改你的代码并再次构建镜像,最后将新旧输出结果与 docker image ls 的结果进行比较。是否存在两个镜像或只有一个? - DevilaN
@DevilaN 我已经这样做了,更改代码并重新构建后,我看到相同的图像,字段为“创建时间:25分钟前”,尽管我刚刚构建了新的图像。 - Vladislav Ashikhin
请包含您的构建命令输出。我们需要看到构建成功并且没有缓存。 - BMitch
2个回答

1

在执行docker-compose build --no-cache后,为确保使用最新的镜像重启服务,我使用以下命令:

docker-compose up -d <service> --force-recreate


0

如果要强制进行无缓存构建,您可以尝试使用--no-cache选项,这将排除任何缓存选项实际发生的可能性。您还可以通过使用类似以下内容的东西来强制清理所有图像

docker-compose down -v --rmi all --remove-orphans

然后再尝试重新构建。

没有更多的细节或查看实际使用的docker-compose文件,这是一个一般性的尝试来解决问题。

编辑:根据您展示的示例,它可能不会捕获新图像的dockerfile中的任何更改,那么--build将只使用先前构建的缓存图像。如果您有构建的输出,那将很有帮助,但如果没有理由让docker构建新的图像,它将跳过已经存在的缓存图像。尝试使用--no-cache选项进行构建,并检查所有COPY/RUN参数是否按预期触发了新的构建。


似乎这个命令与在 Docker Desktop 中手动删除镜像的操作相同。目前看来行为是一样的,有时候镜像会更新,有时候不会。我的同事听说 Docker Desktop 有一些内部缓存或数据库,用于存储构建好的镜像。但我还没有调查这个问题。 - Vladislav Ashikhin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接