Многоступенчатый Dockerfile

Я нашел dockerfile для android sdk

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 image. Сборка 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 image. Сборка Apk не удалась. Ошибка здесь:

ОШИБКА: JAVA_HOME не установлен, и в вашем PATH не найдена команда 'java'.


person zakjma    schedule 02.06.2019    source источник


Ответы (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), а затем вручную установить другой (python).

person matanper    schedule 02.06.2019
comment
Мне нужен финальный образ, содержащий среду разработки android-sdk и python. Текущий поток - python- ›вывод-› копирование вывода на второй уровень- ›java (без рубина) -› финальное изображение для моих многоступенчатых настроек. Я прав? - person zakjma; 03.06.2019
comment
Я тебя не понял. представленный поток отличается от приведенного выше файла Dockerfile. Если вам нужен anrdoid sdk + python, используйте первый Dockerfile и добавьте в него установку python, используя apt-get - person matanper; 03.06.2019
comment
Да, мне нужен python + android sdk. - person zakjma; 03.06.2019