如何删除Docker卷进行生产和COPY?

时间:2019-12-22 10:14:28

标签: docker docker-compose dockerfile containers

我有一个简单的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

1 个答案:

答案 0 :(得分:0)

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为产品添加了新行

php:
    build:
      context: .
      dockerfile: php/Dockerfile
      target: prod

container_name: phpcontainer
ports:
  - "9000:9000"
networks:
  - laranet

2)产品中没有绑定?

开发人员的匿名卷将是有效的解决方案吗?例如通过VOLUME /var/www/html的定义,您可以指定/var/www/html路径的内容应在容器启动时放入卷中。如果在docker-compose.yml中未指定任何卷,它将为您创建一个卷。甜美的权利吗?


侧注

我不建议您将开发人员和生产人员的行为分开。

我建议您在整个阶段中使用卷。 prod的唯一区别可能是在定义VOLUME之前将内容复制到了图像->中,因为定义VOLUME会使文件夹在接下来的层中不可更改。

david-maze指出(请参阅评论)

在您的Dockerfile中放入一个VOLUME通常只会带来令人困惑的副作用,我建议您仅在绝对清楚这意味着什么的情况下才这样做。 OP的设置绝对不需要它(并且实际上具有在生产系统上泄漏匿名卷的可能的副作用


来源