我有一个简单的 Laravel 应用程序,其中 Nginx、PHP 和 MySQL 都在自己的容器中。它在我的开发环境中运行良好,但对于生产,我需要删除绑定(bind)卷并将内容复制到镜像本身。但是我该怎么做呢?
我需要单独的docker-compose-prod.yml
文件?如何删除用于生产的卷?部署生产时如何将我的源代码和配置复制到镜像中?
这是我的docker-compose.yml
文件
version: '3'
networks:
laranet:
services:
nginx:
image: nginx:stable-alpine
container_name: nginxcontainer
ports:
- "80:80"
volumes:
- ./src:/var/www/html
- ./nginx/default.conf:/etc/nginx/conf.d/default.conf
depends_on:
- php
- mysql
networks:
- laranet
mysql:
image: mysql:5.7.22
container_name: mysqlcontainer
ports:
- "3306:3306"
volumes:
- ./mysql:/var/lib/mysql
networks:
- laranet
php:
build:
context: .
dockerfile: php/Dockerfile
container_name: phpcontainer
volumes:
- ./src:/var/www/html
ports:
- "9000:9000"
networks:
- laranet
这是我的
php/Dockerfile
FROM php:7.2-fpm-alpine
RUN docker-php-ext-install pdo pdo_mysql
RUN chown -R www-data:www-data /var/www
RUN chmod 755 /var/www
最佳答案
1) 仅为产品复制数据
只有在使用目标“prod”进行构建时,才能使用多阶段构建来复制内容。
FROM php:7.2-fpm-alpine as base
RUN docker-php-ext-install pdo pdo_mysql
RUN chown -R www-data:www-data /var/www
RUN chmod 755 /var/www
FROM base as dev
VOLUME /var/www/html
FROM base as prod
COPY data /var/www/html
VOLUME /var/www/html
你的 Docker-compose.yml 得到一个新的 prod 行
php:
build:
context: .
dockerfile: php/Dockerfile
target: prod
container_name: phpcontainer
ports:
- "9000:9000"
networks:
- laranet
2)产品中没有绑定(bind)?
dev 的匿名卷会是一个有效的解决方案吗?例如通过
VOLUME /var/www/html
的定义您指定 /var/www/html
的内容路径应在容器启动时放入卷中。如果 docker-compose.yml 中没有指定卷,它将为您创建一个卷。甜吗?边注
我不建议在开发和产品之间划分你的行为。
我建议您在整个阶段都使用卷。 prod 的唯一区别可能是您将内容复制到图像中 -> 在定义 VOLUME 之前,因为定义 VOLUME 会使文件夹在以下层中不可更改。
david-maze指出(见评论)
在你的 Dockerfile 中添加一个 VOLUME 只会产生令人困惑的副作用,我建议只有在你完全清楚它的含义时才这样做。 OP 的设置绝对不需要它(实际上有 在生产系统上泄漏匿名卷的可能副作用 )
来源
关于docker - 如何删除用于生产和复制的 Docker 卷?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59443306/