如何使用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

请问一下,这样的打包镜像部署项目是否正确,缺少什么东西,如何优化?在此先感谢了!

附言 1  ·  1年前

好了,在同事的帮助下搞定了,但是线上用的是k8s。。

《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
讨论数量: 8

其实可以基于你现在这个基础镜像 dnmp-php80,做一个该项目的基础镜像。在这里面做 composer install 相关的操作,最后只保留 vendor 目录。

之后的代码部署,如果没有更新依赖,就可以加快镜像打包了,因为不用执行安全依赖的步骤。如果更新了依赖,就先重新构建基础镜像,再构建应用。

1年前 评论

docker 只做基础、完整项目请用docker-compose 编排 而不是docker

1年前 评论

推荐一个github项目,github.com/yeszao/dnmp ,已经写好了的dockerfile,自己看着文档稍作修改就可以用了

1年前 评论
mouyong

github.com/mouyong/docker-php mysql 、redis、文件存储请使用外部服务。方便扩缩容

1年前 评论

第一个问题

.env 文件映射到镜像里面会好一点吧,毕竟你本地的 .env 和测试、生产环境的应该是不一样的

第二个问题

如果在 build 的时候执行 key:generate 是不是会导致和线上的 key 不一样,部署之后就会导致一些缓存失效,解决方法应该是和第一个问题一样。从外部映射到镜像

第三个问题

build 镜像阶段是否要执行 migrate 命令值得商榷

1年前 评论

这是我们项目的Dockerfile,直接将php+nginx+代码构建为一个镜像

FROM webdevops/php-nginx:7.4-alpine

# 配置nginx
COPY ./docker/nginx/vhost.conf /opt/docker/etc/nginx/vhost.conf

# php配置
ENV PHP_MEMORY_LIMIT  '2048M'
ENV PHP_POST_MAX_SIZE  '200M'
ENV PHP_UPLOAD_MAX_FILESIZE  '200M'
ENV PHP_MAX_EXECUTION_TIME  600

#nginx配置
ENV SERVICE_NGINX_CLIENT_MAX_BODY_SIZE  '200m'

#php-fpm配置
ENV FPM_PM_MIN_SPARE_SERVERS 10
ENV FPM_PM_MAX_SPARE_SERVERS 30
ENV FPM_PM_START_SERVERS 10
ENV FPM_PM_MAX_CHILDREN 150
ENV FPM_MAX_REQUESTS 1000

## 把项目复制到容器对应目录
COPY ./ /app

WORKDIR /app

RUN rm -rf  /app/.git

RUN composer install -o --no-dev

RUN set -ex;\
    #代码部署
    if [[ ! -f "/app/storage/configure/.env" ]] && [[ -f "/app/storage/configure/.env.example" ]];\
    then\
       cp /app/storage/configure/.env.example /app/storage/configure/.env;\
       php artisan app:key-generate;\
       php artisan jwt:secret --force;\
    fi; \
    if [[ ! -f "/app/storage/configure/plus.yml" ]] && [[ -f "/app/storage/configure/plus.yml.example" ]];\
    then\
      cp /app/storage/configure/plus.yml.example /app/storage/configure/plus.yml;\
    fi; \
    php artisan storage:link  && \
    chown -R application:application /app/  && \
    chmod -R 775 /app/storage;

RUN php artisan optimize
1年前 评论

主要是看你想怎么部署

1.一台服务器就 docker-compose 配合 dnmp就行了

2.放到函数计算这种Faas平台的话 就单独处理成一个 docker镜像去部署. 用dnmp的php镜像加入 nginx 或者直接 php -S 启动也是可以的

1年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!