当前位置: 首页 > 知识库问答 >
问题:

从特定步骤重建docker图像

邓卓
2023-03-14

我有下面的 Dockerfile。

FROM ubuntu:14.04
MAINTAINER Samuel Alexander <samuel@alexander.com>

RUN apt-get -y install software-properties-common
RUN apt-get -y update

# Install Java.
RUN echo oracle-java8-installer shared/accepted-oracle-license-v1-1 select true | debconf-set-selections
RUN add-apt-repository -y ppa:webupd8team/java
RUN apt-get -y update
RUN apt-get install -y oracle-java8-installer
RUN rm -rf /var/lib/apt/lists/*
RUN rm -rf /var/cache/oracle-jdk8-installer

# Define working directory.
WORKDIR /work

# Define commonly used JAVA_HOME variable
ENV JAVA_HOME /usr/lib/jvm/java-8-oracle

# JAVA PATH
ENV PATH /usr/lib/jvm/java-8-oracle/bin:$PATH

# Install maven
RUN apt-get -y update
RUN apt-get -y install maven

# Install Open SSH and git
RUN apt-get -y install openssh-server
RUN apt-get -y install git

# clone Spark
RUN git clone https://github.com/apache/spark.git
WORKDIR /work/spark
RUN mvn -DskipTests clean package

# clone and build zeppelin fork
RUN git clone https://github.com/apache/incubator-zeppelin.git
WORKDIR /work/incubator-zeppelin
RUN mvn clean package -Pspark-1.6 -Phadoop-2.6 -DskipTests

# Install Supervisord
RUN apt-get -y install supervisor
RUN mkdir -p var/log/supervisor

# Configure Supervisord
COPY conf/supervisord.conf /etc/supervisor/conf.d/supervisord.conf

# bash
RUN sed -i s#/home/git:/bin/false#/home/git:/bin/bash# /etc/passwd

EXPOSE 8080 8082
CMD ["/usr/bin/supervisord"]

在构建映像时,它在步骤 23 中失败,即

RUN mvn clean package -Pspark-1.6 -Phadoop-2.6 -DskipTests

现在,当我重建它时,它从步骤 23 开始构建,因为 docker 正在使用缓存。

但是如果我想从步骤21重建图像,即

RUN git clone https://github.com/apache/incubator-zeppelin.git

我该怎么做呢?删除缓存的图像是唯一的选择吗?有没有额外的参数可以做到这一点?

共有3个答案

富凯风
2023-03-14

为了完成Dmitry的回答,您可以使用uniq arg like date %s来始终保持相同的命令行

docker build --build-arg DUMMY=`date +%s` -t me/myapp:1.0.0

Dockerfile

...
ARG DUMMY=unknown
RUN DUMMY=${DUMMY} git clone xxx
...
欧阳安晏
2023-03-14

一种解决方法:

  1. 找到要从中执行的步骤
  2. 在该步骤之前,执行一个简单的伪操作,如“RUN pwd”

然后构建您的Dockerfile。它将从缓存中获取该步骤之前的所有内容,然后执行虚拟命令之后的行。

方斌
2023-03-14

您可以在不使用缓存的情况下通过执行

docker build --no-cache -t user/image-name

要强制从特定行开始重新运行,可以传递一个未使用的arg。Docker将ARG值作为环境变量传递给RUN命令,因此更改ARG就是更改会破坏缓存的命令。甚至不需要在RUN线上自己定义。

FROM ubuntu:14.04
MAINTAINER Samuel Alexander <samuel@alexander.com>

RUN apt-get -y install software-properties-common
RUN apt-get -y update

# Install Java.
RUN echo oracle-java8-installer shared/accepted-oracle-license-v1-1 select true | debconf-set-selections
RUN add-apt-repository -y ppa:webupd8team/java
RUN apt-get -y update
RUN apt-get install -y oracle-java8-installer
RUN rm -rf /var/lib/apt/lists/*
RUN rm -rf /var/cache/oracle-jdk8-installer

# Define working directory.
WORKDIR /work

# Define commonly used JAVA_HOME variable
ENV JAVA_HOME /usr/lib/jvm/java-8-oracle

# JAVA PATH
ENV PATH /usr/lib/jvm/java-8-oracle/bin:$PATH

# Install maven
RUN apt-get -y update
RUN apt-get -y install maven

# Install Open SSH and git
RUN apt-get -y install openssh-server
RUN apt-get -y install git

# clone Spark
RUN git clone https://github.com/apache/spark.git
WORKDIR /work/spark
RUN mvn -DskipTests clean package

# clone and build zeppelin fork, changing INCUBATOR_VER will break the cache here
ARG INCUBATOR_VER=unknown
RUN git clone https://github.com/apache/incubator-zeppelin.git
WORKDIR /work/incubator-zeppelin
RUN mvn clean package -Pspark-1.6 -Phadoop-2.6 -DskipTests

# Install Supervisord
RUN apt-get -y install supervisor
RUN mkdir -p var/log/supervisor

# Configure Supervisord
COPY conf/supervisord.conf /etc/supervisor/conf.d/supervisord.conf

# bash
RUN sed -i s#/home/git:/bin/false#/home/git:/bin/bash# /etc/passwd

EXPOSE 8080 8082
CMD ["/usr/bin/supervisord"]

然后只需使用唯一的参数运行它:

docker build --build-arg INCUBATOR_VER=20160613.2 -t user/image-name .

要在每次构建时更改参数,可以将时间戳作为参数传递:

docker build --build-arg INCUBATOR_VER=$(date +%Y%m%d-%H%M%S) -t user/image-name .

或:

docker build --build-arg INCUBATOR_VER=$(date +%s) -t user/image-name .

顺便说一句,我建议您进行以下更改以保持图层较小,在下载和安装后,您越能在单个RUN命令上合并清理和删除步骤,最终图像就越小。否则,您的图层将包括下载和清理之间的所有中间步骤:

FROM ubuntu:14.04
MAINTAINER Samuel Alexander <samuel@alexander.com>

RUN DEBIAN_FRONTEND=noninteractive \
    apt-get -y install software-properties-common && \
    apt-get -y update

# Install Java.
RUN echo oracle-java8-installer shared/accepted-oracle-license-v1-1 select true | debconf-set-selections && \
    add-apt-repository -y ppa:webupd8team/java && \
    apt-get -y update && \
    DEBIAN_FRONTEND=noninteractive \
    apt-get install -y oracle-java8-installer && \
    apt-get clean && \
    rm -rf /var/lib/apt/lists/* && \
    rm -rf /var/cache/oracle-jdk8-installer && \

# Define working directory.
WORKDIR /work

# Define commonly used JAVA_HOME variable
ENV JAVA_HOME /usr/lib/jvm/java-8-oracle

# JAVA PATH
ENV PATH /usr/lib/jvm/java-8-oracle/bin:$PATH

# Install maven
RUN apt-get -y update && \
    DEBIAN_FRONTEND=noninteractive \
    apt-get -y install 
      maven \
      openssh-server \
      git \
      supervisor && \
    apt-get clean && \
    rm -rf /var/lib/apt/lists/*

# clone Spark
RUN git clone https://github.com/apache/spark.git
WORKDIR /work/spark
RUN mvn -DskipTests clean package

# clone and build zeppelin fork
ARG INCUBATOR_VER=unknown
RUN git clone https://github.com/apache/incubator-zeppelin.git
WORKDIR /work/incubator-zeppelin
RUN mvn clean package -Pspark-1.6 -Phadoop-2.6 -DskipTests

# Configure Supervisord
RUN mkdir -p var/log/supervisor
COPY conf/supervisord.conf /etc/supervisor/conf.d/supervisord.conf

# bash
RUN sed -i s#/home/git:/bin/false#/home/git:/bin/bash# /etc/passwd

EXPOSE 8080 8082
CMD ["/usr/bin/supervisord"]
 类似资料:
  • 问题内容: 我有下面的Dockerfile。 构建图像时,它在步骤23中失败,即 现在,当我重建时,由于docker使用缓存,它从步骤23开始构建。 但是,如果我想从步骤21重建图像,即 我怎样才能做到这一点?删除缓存的图像是唯一的选择吗?是否有其他参数可以做到这一点? 问题答案: 您可以通过执行以下操作来重建整个内容,而无需使用缓存 要强制从特定行开始重新运行,可以传递一个未使用的arg。Doc

  • 我正在使用activiti 6为我们的一个项目设计业务流程。这个过程非常简单,它由“用户任务”或“服务任务”的数量以及基于角色的分配组成。然而,我们的客户希望管理员用户能够在任何时间点重新运行之前的任何“用户任务”或“服务任务”。 例如,以下是我的流程: 开始- 客户端希望在流程执行期间的任何时间点,管理员用户都应该能够将工作流执行从:例如状态“User-Task8”更改为Service-Task

  • 我能够设置github和AWS CodePipeline之间的集成,所以现在我的代码在lambda函数的推送事件之后上传到S3。这很有效。 S3上带有源代码的新ZIP触发了一个管道,该管道生成代码。那很好。现在我还想为这个项目建立一个docker形象。 第一个问题是不能混合使用项目(nodejs)构建和docker构建。那很好,有道理。下一个问题是您不能有另一个buildspec。用于docker

  • 本文向大家介绍Docker 搭建集群MongoDB的实现步骤,包括了Docker 搭建集群MongoDB的实现步骤的使用技巧和注意事项,需要的朋友参考一下 前言 由于公司业务需要,我们打算自己搭建 MongoDB 的服务,因为 MongoDB 的云数据库好贵,我们这次采用副本集的方式来搭建集群,三台服务器,一主、一副、一仲裁 基本概念 Replica Set 副本集:一个副本集就是一组 Mongo

  • 本文向大家介绍Maven插件构建Docker镜像的实现步骤,包括了Maven插件构建Docker镜像的实现步骤的使用技巧和注意事项,需要的朋友参考一下 背景 微服务架构下,微服务在带来良好的设计和架构理念的同时,也带来了运维上的额外复杂性,尤其是在服务部署和服务监控上。单体应用是集中式的,就一个单体跑在一起,部署和管理的时候非常简单,而微服务是一个网状分布的,有很多服务需要维护和管理,对它进行部署

  • 本文向大家介绍通过Dockerfile构建Docker镜像的方法步骤,包括了通过Dockerfile构建Docker镜像的方法步骤的使用技巧和注意事项,需要的朋友参考一下 Dockerfile是一个文本文件,其内包含了一条条的指令(Instruction),每一条指令构建一层,因此每一条指令的内容,就是描述该层应当如何构建. Dockerfile支持Shell类的行尾添加"\"的命令换行方式,以及