如何使用Dockerfile打包镜像部署laravel项目
现在有一个laravel项目,领导要求需要使用Dockerfile打包镜像进行部署,两眼一抹黑,看了很多Dockerfile相关的文章,好像跟所需要的相差甚远。
线上和本地均使用了docker(dnmp),线上的容器有mysql,php5,php7以及其他,本地除了上述几个,还有一个自己安装的php8容器,如果使用Dockerfile打包镜像,那么我的基础镜像是不是应该就是php8这个镜像:
# 基础镜像
FROM dnmp-php80
ARG LARAVEL_PATH=/data/www/xxx
# 拷贝代码到工作区(.表示我在当前项目目录下)
COPY . ${LARAVEL_PATH}
#执行相关操作
RUN cd ${LARAVEL_PATH} \
&& composer config -g repo.packagist composer https://mirrors.aliyun.com/composer/ \
&& composer install \
--ignore-platform-reqs \
--no-interaction \
--no-plugins \
--no-scripts \
--prefer-dist
&& cp env.sample .env
&& php artisan key:generate
&& php artisan migrate \
&& mkdir -p storage \
&& mkdir -p storage/framework/cache \
&& mkdir -p storage/framework/sessions \
&& mkdir -p storage/framework/testing \
&& mkdir -p storage/framework/views \
&& mkdir -p storage/logs \
&& chmod -R 777 storage
请问一下,这样的打包镜像部署项目是否正确,缺少什么东西,如何优化?在此先感谢了!
好了,在同事的帮助下搞定了,但是线上用的是k8s。。
docker 只做基础、完整项目请用docker-compose 编排 而不是docker
推荐一个github项目,github.com/yeszao/dnmp ,已经写好了的dockerfile,自己看着文档稍作修改就可以用了
github.com/mouyong/docker-php mysql 、redis、文件存储请使用外部服务。方便扩缩容
github.com/shunhua/dnmp
其实可以基于你现在这个基础镜像
dnmp-php80
,做一个该项目的基础镜像。在这里面做composer install
相关的操作,最后只保留vendor
目录。之后的代码部署,如果没有更新依赖,就可以加快镜像打包了,因为不用执行安全依赖的步骤。如果更新了依赖,就先重新构建基础镜像,再构建应用。
第一个问题
.env 文件映射到镜像里面会好一点吧,毕竟你本地的 .env 和测试、生产环境的应该是不一样的
第二个问题
如果在 build 的时候执行 key:generate 是不是会导致和线上的 key 不一样,部署之后就会导致一些缓存失效,解决方法应该是和第一个问题一样。从外部映射到镜像
第三个问题
build 镜像阶段是否要执行 migrate 命令值得商榷
这是我们项目的Dockerfile,直接将php+nginx+代码构建为一个镜像
主要是看你想怎么部署
1.一台服务器就 docker-compose 配合 dnmp就行了
2.放到函数计算这种Faas平台的话 就单独处理成一个 docker镜像去部署. 用dnmp的php镜像加入 nginx 或者直接 php -S 启动也是可以的