Docker多阶段构建的镜像不共存

时间:2018-08-18 11:03:31

标签: docker dockerfile docker-multi-stage-build

我正在尝试了解Docker多阶段构建。我有Docker工具箱18.03,因此我可以运行它们。看完this paper之后,我的第一个尝试是使用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中缺少什么?

2 个答案:

答案 0 :(得分:1)

多阶段构建中的最后一个图像是目标图像。为了合并内容,您需要使用copy-从原始图像到目标图像。

比起从第一个映像复制python(无需使用多阶段构建),将python安装在目标映像上会更加容易和安全。

通常,多阶段构建用于创建生产就绪的映像,而没有编译时间依赖性(在第一个映像上编译,将可执行文件复制到目标映像)

答案 1 :(得分:0)

我以其他示例为例,它可以帮助您了解多阶段Dockerfile

要求:-应该使用mvn构建Java代码,然后将.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映像,然后在第二阶段(Tomcat)中使用“ mvn install -DskipTests”构建mvn项目,然后将.war文件生成的先前映像复制到tomcat映像。 这样我就可以减小图像尺寸。

如果我不使用多阶段,则需要获取jdk或ubuntu映像,然后在顶部安装maven和tomcat,那么映像大小将增加一倍。

有关简单的Hello World Web Java项目,您可以参考https://github.com/DeekshithSN/Java_app

希望它对您有帮助