docker - 如何删除用于生产和复制的 Docker 卷?

标签 docker docker-compose dockerfile containers

我有一个简单的 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 的设置绝对不需要它(实际上有 在生产系统上泄漏匿名卷的可能副作用 )

来源
  • multi-stage build in docker compose?
  • https://docs.docker.com/engine/reference/builder/#volume
  • 关于docker - 如何删除用于生产和复制的 Docker 卷?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59443306/

    相关文章:

    ubuntu - Docker 机器 + Docker Compose + Ubuntu 上的卷

    mysql - 我如何让 Lando mysql portforward 与 lamp 配方一起工作

    docker - 为什么在没有 sudo 的情况下运行时为空 'docker-machine ls' 输出,而 'sudo docker-machine ls' 有效?

    docker - 如何知道docker CMD何时完成?

    Docker 镜像时间戳问题

    docker - 关于在创建 docker 基本容器后没有获得 GNU awk 版本

    docker - 如何通过ENV变量在Docker中构建进程

    reactjs - 容器化的 ReactJs 应用程序(来自 nginx 图像)不提供所有路由

    docker - 我们如何使用 Chef Recipe 登录到 docker hub(私有(private)注册表)?

    Jenkins 在带有生成报告的 docker 容器中构建