我有一个简单的Laravel应用程序,分别在各自的容器中包含Nginx,PHP和MySQL。它在我的开发环境中效果很好,但是对于生产而言,我需要删除绑定卷并将内容复制到映像本身。但是我该怎么做?
我需要单独的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
答案 0 :(得分:0)
仅当使用目标“ 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为产品添加了新行
php:
build:
context: .
dockerfile: php/Dockerfile
target: prod
container_name: phpcontainer
ports:
- "9000:9000"
networks:
- laranet
开发人员的匿名卷将是有效的解决方案吗?例如通过VOLUME /var/www/html
的定义,您可以指定/var/www/html
路径的内容应在容器启动时放入卷中。如果在docker-compose.yml中未指定任何卷,它将为您创建一个卷。甜美的权利吗?
我不建议您将开发人员和生产人员的行为分开。
我建议您在整个阶段中使用卷。 prod的唯一区别可能是在定义VOLUME之前将内容复制到了图像->中,因为定义VOLUME会使文件夹在接下来的层中不可更改。
david-maze指出(请参阅评论)
在您的Dockerfile中放入一个VOLUME通常只会带来令人困惑的副作用,我建议您仅在绝对清楚这意味着什么的情况下才这样做。 OP的设置绝对不需要它(并且实际上具有在生产系统上泄漏匿名卷的可能的副作用)