Многоступенчатые сборки Docker с несовместимыми образами

Я пытаюсь понять многоступенчатые сборки Docker. У меня есть панель инструментов Docker 18.03, поэтому я могу их запускать. Моя первая попытка после просмотра документов должен был создать образ с помощью Python 3.7 и Php-apache. Итак, я написал этот Dockerfile:

FROM python:3.7.0-stretch

FROM php:7-apache-stretch

RUN docker-php-ext-install mbstring mysqli pdo pdo_mysql
RUN a2enmod rewrite

# Enable SSL
RUN a2enmod ssl
RUN mkdir /etc/apache2/ssl
ADD server.crt /etc/apache2/ssl/
ADD server.key /etc/apache2/ssl/
ADD default-ssl.conf /etc/apache2/sites-available/
RUN a2ensite default-ssl
EXPOSE 443

RUN echo 'log_errors = On' >> /usr/local/etc/php/php.ini

Затем я запускаю docker build ., и он успешно построил:

Sending build context to Docker daemon  12.29kB
Step 1/12 : FROM python:3.7.0-stretch
 ---> 825141134528
Step 2/12 : FROM php:7-apache-stretch
 ---> 5e5a59788e34
Step 3/12 : RUN docker-php-ext-install mbstring mysqli pdo pdo_mysql
 ---> Using cache
 ---> bf6b095ac6d3
Step 4/12 : RUN a2enmod rewrite
 ---> Using cache
 ---> d3443d0e8d97
Step 5/12 : RUN a2enmod ssl
 ---> Running in edd0a15406db
Considering dependency setenvif for ssl:
Module setenvif already enabled
Considering dependency mime for ssl:
Module mime already enabled
Considering dependency socache_shmcb for ssl:
Enabling module socache_shmcb.
Enabling module ssl.
See /usr/share/doc/apache2/README.Debian.gz on how to configure SSL and create self-signed certificates.
To activate the new configuration, you need to run:
  service apache2 restart
Removing intermediate container edd0a15406db
 ---> a301c3a3ca78
Step 6/12 : RUN mkdir /etc/apache2/ssl
 ---> Running in 59621555d753
Removing intermediate container 59621555d753
 ---> db74733784c3
Step 7/12 : ADD server.crt /etc/apache2/ssl/
 ---> db3715192748
Step 8/12 : ADD server.key /etc/apache2/ssl/
 ---> f6206d6b2d5e
Step 9/12 : ADD default-ssl.conf /etc/apache2/sites-available/
 ---> 0fa5dd62c854
Step 10/12 : RUN a2ensite default-ssl
 ---> Running in 7ab353bca552
Enabling site default-ssl.
To activate the new configuration, you need to run:
  service apache2 reload
Removing intermediate container 7ab353bca552
 ---> 53336ee4133d
Step 11/12 : EXPOSE 443
 ---> Running in 0530749e96b3
Removing intermediate container 0530749e96b3
 ---> 53b56723dd81
Step 12/12 : RUN echo 'log_errors = On' >> /usr/local/etc/php/php.ini
 ---> Running in 8bd7c50715c3
Removing intermediate container 8bd7c50715c3
 ---> d456abb9ee67
Successfully built d456abb9ee67

Затем я создал для него контейнер и запустил. Он запустился и остался работать, поэтому я попытался войти в bash контейнера, и вот что удивительно: php и apache работают нормально, python даже не существует. Что мне не хватает в Dockerfile?


person Ripper346    schedule 18.08.2018    source источник
comment
Возможный дубликат Как использовать несколько базовых изображений для создать образ докера   -  person David Maze    schedule 18.08.2018


Ответы (2)


Последний образ в многоступенчатой ​​сборке - это целевой образ. Чтобы объединить содержимое, вам нужно использовать copy - from original to target image.

Было бы проще и безопаснее установить python на целевой образ, чем копировать его с первого (без использования многоступенчатой ​​сборки)

Обычно многоступенчатые сборки используются для создания образов, готовых к продуктам, без зависимостей от времени компиляции (компилировать на первом образе, копировать исполняемые файлы в целевой образ)

person gCoh    schedule 18.08.2018
comment
Я вижу, как в примере с документами, что есть предпоследняя строка COPY --from=0 /go/src/github.com/alexellis/href-counter/app .. Спасибо! Я последую вашему предложению по установке python на целевое изображение - person Ripper346; 18.08.2018

Я взял другой пример, он может помочь вам понять многоступенчатый Dockerfile.

Требование: - java-код должен быть построен с использованием mvn, а затем развернут файл .war на tomcat

Dockerfile

FROM maven as maven
RUN mkdir /usr/src/mymaven
WORKDIR /usr/src/mymaven
COPY . .
RUN mvn install -DskipTests

FROM tomcat 
WORKDIR webapps 
COPY --from=maven /usr/src/mymaven/target/java-tomcat-maven-example.war .
RUN rm -rf ROOT && mv java-tomcat-maven-example.war ROOT.war

в приведенном выше файле Dockerfile я копирую свой java-код из локального образа в образ maven, а затем создаю проект mvn, используя команду «mvn install -DskipTests», после чего на втором этапе (Tomcat) копирую файл .war, сгенерированный предыдущим изображением, в образ tomcat. Таким образом, я смог уменьшить размер своего изображения.

Если бы я не использовал многоступенчатый, тогда мне нужно было бы взять образ jdk или ubuntu, а затем поверх, который необходимо установить maven и tomcat, размер образа был бы удвоен.

для простого java-проекта hello world вы можете обратиться к https://github.com/DeekshithSN/Java_app

Надеюсь, это поможет тебе

person Sugatur Deekshith S N    schedule 05.12.2018