【问题标题】:Multi-stage Dockerfile多阶段 Dockerfile
【发布时间】:2019-06-02 16:47:05
【问题描述】:

我找到了 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”命令 你的路径。

【问题讨论】:

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


    【解决方案1】:

    当使用 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)开始,然后手动安装另一个(蟒蛇)。

    【讨论】:

    • 我需要一个包含android-sdk和python开发环境的最终镜像。当前流程是python->输出->将输出复制到第二层-> java(没有ruby)->我的多阶段设置的最终图像。我说的对吗?
    • 我不明白你的意思。您提供的流程与上面的 Dockerfile 不同。如果您需要 anrdoid sdk +python,请使用第一个 Dockerfile 并使用apt-get添加 python 安装
    • 是的,我需要python+android sdk。
    猜你喜欢
    • 2020-12-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多