多阶段Dockerfile

时间:2019-06-02 16:47:05

标签: docker android-sdk-tools docker-image docker-multi-stage-build

我找到了android sdk的dockerfile

FROM openjdk:8

RUN apt-get update && \
    apt-get install -y openjdk-8-jdk wget unzip && \
    rm -rf /var/lib/apt/lists/*

ENV ANDROID_HOME /opt/android-sdk-linux

RUN mkdir -p ${ANDROID_HOME} && \
    cd ${ANDROID_HOME} && \
    wget -q https://dl.google.com/android/repository/sdk-tools-linux-3859397.zip -O android_tools.zip && \
    unzip android_tools.zip && \
    rm android_tools.zip

ENV PATH ${PATH}:${ANDROID_HOME}/tools:${ANDROID_HOME}/tools/bin:${ANDROID_HOME}/platform-tools

RUN yes | sdkmanager --licenses

我连接到docker映像。 Apk建设正常。

但是我的项目需要不同的依赖关系。另一个dockerfile内容如下:

FROM python:3.7-alpine

COPY . /app
WORKDIR /app
RUN pip install -r requirements.txt

适用于pyhton应用。

但是,如何合并这些文件?

以下设置无效:

FROM openjdk:8

RUN apt-get update && \
    apt-get install -y openjdk-8-jdk wget unzip && \
    rm -rf /var/lib/apt/lists/*

ENV ANDROID_HOME /opt/android-sdk-linux

RUN mkdir -p ${ANDROID_HOME} && \
    cd ${ANDROID_HOME} && \
    wget -q https://dl.google.com/android/repository/sdk-tools-linux-3859397.zip -O android_tools.zip && \
    unzip android_tools.zip && \
    rm android_tools.zip

ENV PATH ${PATH}:${ANDROID_HOME}/tools:${ANDROID_HOME}/tools/bin:${ANDROID_HOME}/platform-tools

RUN yes | sdkmanager --licenses
FROM python:3.7-alpine

COPY . /app
WORKDIR /app
RUN pip install -r requirements.txt

我连接docker镜像。 APK构建失败。错误在这里:

  

错误:未设置JAVA_HOME,并且在以下位置找不到“ java”命令   您的路径。

1 个答案:

答案 0 :(得分:0)

使用docker多阶段构建时,每个阶段都以FROM开始,并且它不会累积前一阶段的文件(也没有环境变量),因此您必须手动复制所需的文件。例如,在下一个Dockerfile中,构建的映像将与openjdk:8相同,并且既没有应用程序也没有Python。

FROM python:3.7-alpine

COPY . /app
WORKDIR /app
RUN pip install -r requirements.txt

FROM openjdk:8

要从上一个阶段复制文件,您需要提及要复制的文件和从哪个阶段复制

FROM python:3.7-alpine AS python

COPY . /app
WORKDIR /app
RUN pip install -r requirements.txt

FROM openjdk:8
WORKDIR /app
COPY --from=python /app .

多阶段构建主要用于仅需要构建过程而不需要最终映像的编译器之类的情况。它使您可以将图像与构建中所需的依赖项一起使用,然后将它们抛在后面,仅使用最终产品和运行时所需的依赖项。

对于Dockerfile,如果同时需要python和java多阶段构建都无济于事,则应查找包含两者的基本映像,或者以一个映像(例如java)开头,然后手动安装另一个映像( python)。