我需要减少我的Laravel 5.8项目的Docker图像大小。
我现在有这个
FROM composer:latest
COPY . /src
ADD .env.example /src/.env
WORKDIR /src
RUN composer install
RUN php artisan key:generate
RUN chmod -R 777 storage/
CMD php artisan serve --host=0.0.0.0
doccker-compose.yml
version: '3'
services:
johnywalker5g:
container_name: johnywalker5g
build:
context: .
dockerfile: Dockerfile
ports:
- 8000:8000
开始时,我运行了docker compose up
。我的网站正在运行。
然后我查了Docker的图片
docker images
我看到了
REPOSITORY TAG IMAGE ID CREATED SIZE
johnywalker5g latest c404551006c7 About an hour ago 193MB
composer latest 520372566db9 2 weeks ago 157MB
大小有点太大了193MB
157MB
docker历史记录c404551006c7
520372566db9 2 weeks ago /bin/sh -c #(nop) CMD ["composer"] 0B
<missing> 2 weeks ago /bin/sh -c #(nop) ENTRYPOINT ["/bin/sh" "/d… 0B
<missing> 2 weeks ago /bin/sh -c #(nop) WORKDIR /app 0B
<missing> 2 weeks ago /bin/sh -c #(nop) COPY file:098af1c9d6ed00c2… 1.13kB
<missing> 2 weeks ago /bin/sh -c curl --silent --fail --location -… 1.91MB
<missing> 2 weeks ago /bin/sh -c #(nop) ENV COMPOSER_VERSION=1.8.4 0B
<missing> 2 weeks ago /bin/sh -c #(nop) ENV COMPOSER_HOME=/tmp 0B
<missing> 2 weeks ago /bin/sh -c #(nop) ENV COMPOSER_ALLOW_SUPERU… 0B
<missing> 2 weeks ago /bin/sh -c apk add --no-cache --virtual .bui… 1.83MB
<missing> 2 weeks ago /bin/sh -c echo "memory_limit=-1" > "$PHP_IN… 34B
<missing> 2 weeks ago /bin/sh -c apk --no-cache add --virtual .com… 75.5MB
<missing> 2 weeks ago /bin/sh -c #(nop) CMD ["php" "-a"] 0B
<missing> 2 weeks ago /bin/sh -c #(nop) ENTRYPOINT ["docker-php-e… 0B
<missing> 2 weeks ago /bin/sh -c docker-php-ext-enable sodium 167kB
<missing> 2 weeks ago /bin/sh -c #(nop) COPY multi:03970f7b3773444… 6.45kB
<missing> 2 weeks ago /bin/sh -c set -xe && apk add --no-cache --… 58MB
<missing> 2 weeks ago /bin/sh -c #(nop) COPY file:ce57c04b70896f77… 587B
<missing> 2 weeks ago /bin/sh -c set -xe; apk add --no-cache --v… 12MB
<missing> 2 weeks ago /bin/sh -c #(nop) ENV PHP_SHA256=6bb03e79a1… 0B
<missing> 2 weeks ago /bin/sh -c #(nop) ENV PHP_URL=https://secur… 0B
<missing> 2 weeks ago /bin/sh -c #(nop) ENV PHP_VERSION=7.3.3 0B
<missing> 2 weeks ago /bin/sh -c #(nop) ENV GPG_KEYS=CBAF69F173A0… 0B
<missing> 2 weeks ago /bin/sh -c #(nop) ENV PHP_LDFLAGS=-Wl,-O1 -… 0B
<missing> 2 weeks ago /bin/sh -c #(nop) ENV PHP_CPPFLAGS=-fstack-… 0B
<missing> 2 weeks ago /bin/sh -c #(nop) ENV PHP_CFLAGS=-fstack-pr… 0B
<missing> 2 weeks ago /bin/sh -c set -eux; mkdir -p "$PHP_INI_DIR… 0B
<missing> 2 weeks ago /bin/sh -c #(nop) ENV PHP_INI_DIR=/usr/loca… 0B
<missing> 2 weeks ago /bin/sh -c set -x && addgroup -g 82 -S www-… 4.85kB
<missing> 2 weeks ago /bin/sh -c apk add --no-cache ca-certifica… 2.71MB
<missing> 2 weeks ago /bin/sh -c #(nop) ENV PHPIZE_DEPS=autoconf … 0B
<missing> 2 weeks ago /bin/sh -c #(nop) CMD ["/bin/sh"] 0B
<missing> 2 weeks ago /bin/sh -c #(nop) ADD file:38bc6b51693b13d84… 4.41MB
我们将如何进一步缩小这一规模?
您的docker映像的层位于compose docker映像的层之上,这些层的总大小为157MB
。您的图像是193MB
,唯一可以减少的是您在合成图像上添加的36MB
(193-157
)。让我们看看能挤压什么。
复制/src
将把工作目录的所有内容放入容器/src
目录。这可能比你想要的要多。限制复制到容器中的内容的一种方法是使用。dockerignore文件(这是一篇关于这个主题的好文章)。
此类文件的内容通常类似于:
. docker忽略
.git
.gitignore
README.md
Changelog.md
Dockerfile
docker-compose.yml
docs
在某些项目中,. git
目录可能相当大。如果您的docker映像中还有一个包含数据库转储或其他不需要的大型文件的目录,请确保将它们添加到. docker忽略
文件中。
RUN作曲家安装
还将安装映像中不需要的开发依赖项。把它改成
运行作曲家安装--no-dev
这条路走得更远,所以答案建议使用
运行composer安装--无ansi--无开发--无交互--无进度--无脚本--优化自动加载程序
。
使用dive来探索你的每个图像层,并找出在某个时候添加的不必要的文件。
如果composer只对下载和安装PHP库有用,那么一旦下载和安装了这些库,您可能就想摆脱composer。这不能从经典Dockerfile中完成,因为每一个运行
/复制
或添加
指令都会在前一个指令的基础上生成一个新层。
假设你有一个100MB文件的层,如果你稍后在同一个Dockerfile中删除该文件,删除将发生在一个新层。100MB的前一层仍然在你的层三明治中。
docker带给我们战斗的一个方法就是多级构建Dockerfile。
然后,您的Dockerfile可以按如下方式构造(未测试):
FROM composer:latest as build_stage
COPY . /src
ADD .env.example /src/.env
WORKDIR /src
RUN composer install
RUN php artisan key:generate
FROM php:7-fpm-alpine
COPY --from=build_stage /src /var/www/html
RUN mkdir /var/www/html/storage/ \
&& chmod -R 777 /var/www/html/storage/
警告:这只是Dockerfile的主要结构,您可能需要对其进行更多调整以添加缺少的php扩展。请参阅官方的php docker图像指南。