【问题标题】:How to remove Docker volumes for production and COPY instead?如何删除用于生产和复制的 Docker 卷?
【发布时间】:2019-12-22 10:14:28
【问题描述】:

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

【问题讨论】:

    标签: docker docker-compose dockerfile containers


    【解决方案1】:

    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) prod 中没有绑定?

    dev 的匿名卷会是一个有效的解决方案吗?例如通过VOLUME /var/www/html 的定义,您指定/var/www/html 路径的内容应在容器启动时放入卷中。如果 docker-compose.yml 中没有指定卷,它将为您创建一个卷。甜蜜对吧?


    旁注

    我不建议你在开发和产品之间分开你的行为。

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

    david-maze 指出(见评论)

    在 Dockerfile 中添加 VOLUME 只会产生令人困惑的副作用,我建议您仅在完全清楚其含义时才这样做。 OP 的设置绝对不需要它(实际上有在生产系统上泄漏匿名卷的可能副作用


    来源

    【讨论】:

    • Dockerfile 中添加VOLUME 只会产生令人困惑的副作用,我建议您仅在完全清楚其含义时才这样做。 OP 的设置绝对不需要它(实际上可能会在生产系统上泄漏匿名卷的副作用)。
    • 我是否还需要为 nginx 和 php 复制?还是只有php?
    • 您好 Liga,这取决于您的用例。我可以在您的问题中看到您也在为 nginx 使用绑定卷。因此,我假设您也需要 nginx 容器中的数据。您可以为您的 nginx 创建一个与 php 类似的 dockerfile 来归档相同的行为。但是 -> 请记住 david 的评论,并确保不要在您的 prod 环境中创建孤立的匿名卷。
    • @ClemensKaserer 你能解释一下,为什么我需要 nginx 和 php 中的数据?
    • 嗨,西甲,不,根据现有信息,我无法解释原因。你能解释一下 docker-compose.yml 中 nginx 卷 /src:/var/www/html 和 php 卷 ./src:/var/www/html 背后的原因吗?它是否包括您的 php 和 html 文件?也许你只需要 nginx 中的 html 文件和 php 中的 php 文件,但在这一点上,这纯粹是我的猜测。
    猜你喜欢
    • 1970-01-01
    • 2016-08-08
    • 2018-12-23
    • 1970-01-01
    • 2021-08-06
    • 1970-01-01
    • 1970-01-01
    • 2021-03-12
    • 2018-06-08
    相关资源
    最近更新 更多