Docker 图像不共存的多阶段构建
Docker multi-stage builds with images that doesn't coexist
我正在尝试理解 Docker 多阶段构建。我有 Docker 工具箱 18.03,所以我可以 运行 它们。在查看 docs 之后,我的第一次尝试是使用 Python 3.7 和 Php-apache 构建一个映像。所以我写了这个Docker文件:
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 甚至不存在。我在 Docker 文件中遗漏了什么?
多阶段构建中的最后一个图像是目标图像。为了合并内容,您需要使用 copy --from original to target image。
在目标图像上安装 python 比从第一个图像复制它(不使用多阶段构建)更容易和更安全
通常多阶段构建用于创建生产就绪图像,没有编译时依赖性(在第一个图像上编译,将可执行文件复制到目标图像)
我举了不同的例子,它可能会帮助你理解多阶段 Dockerfile
要求:- java 代码应使用 mvn 构建,然后将 .war 文件部署到 tomcat
Docker 文件
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
希望对你有帮助
我正在尝试理解 Docker 多阶段构建。我有 Docker 工具箱 18.03,所以我可以 运行 它们。在查看 docs 之后,我的第一次尝试是使用 Python 3.7 和 Php-apache 构建一个映像。所以我写了这个Docker文件:
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 甚至不存在。我在 Docker 文件中遗漏了什么?
多阶段构建中的最后一个图像是目标图像。为了合并内容,您需要使用 copy --from original to target image。
在目标图像上安装 python 比从第一个图像复制它(不使用多阶段构建)更容易和更安全
通常多阶段构建用于创建生产就绪图像,没有编译时依赖性(在第一个图像上编译,将可执行文件复制到目标图像)
我举了不同的例子,它可能会帮助你理解多阶段 Dockerfile
要求:- java 代码应使用 mvn 构建,然后将 .war 文件部署到 tomcat
Docker 文件
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
希望对你有帮助