首页 > 解决方案 > 从 dockerfile 退出构建,而从图像保持运行

问题描述

我一直在使用这个Docker-Compose 存储库来使用 phpunit 和 wp-cli 进行 Wordpress 插件/主题开发。

现在我需要在 Wordpress 容器中有肥皂,所以我试图修改它以使用我自己的 Dockerfile。

当我从文件image中的引用构建时docker-compose,Wordpress 容器保持不变:

          Name                        Command              State     Ports
----------------------------------------------------------------------------
mz-docker-dev_mysql_1       docker-entrypoint.sh mysqld      Up      3306/tcp
mz-docker-dev_wordpress_1   docker-entrypoint.sh apach ...   Up      80/tcp

但是当我使用 my 时Dockerfile,它会退出:

          Name                        Command              State     Ports
----------------------------------------------------------------------------
mz-docker-dev_mysql_1       docker-entrypoint.sh mysqld    Up       3306/tcp
mz-docker-dev_wordpress_1   docker-php-entrypoint php -a   Exit 0

这是docker-compose.yml和 my的最小版本Dockerfile

version: "3"

services:
  wordpress:
    build: .
    environment:
      VIRTUAL_HOST: "${DOCKER_DEV_DOMAIN:-project.test}"
      WORDPRESS_DB_HOST: "mysql"
      WORDPRESS_DB_NAME: "wordpress"
      WORDPRESS_DB_PASSWORD: ""
      WORDPRESS_DB_USER: "root"
    depends_on:
      - "mysql"
    networks:
      - "front"
      - "back"
    volumes:
      - "wp:/var/www/html:rw"
      - "./mz-plugin:/var/www/html/wp-content/plugins/mz-plugin:ro"
  mysql:
    image: "mariadb:10.2"
    environment:
      MYSQL_ALLOW_EMPTY_PASSWORD: "yes"
      MYSQL_DATABASE: "wordpress"
      MYSQL_ROOT_PASSWORD: ""
    networks:
      - "back"
    volumes:
      - "./data:/var/lib/mysql"


networks:
  front: {}
  back: {}

volumes:
  wp: {}

Dockerfile:

FROM "wordpress:${WP_VERSION:-latest}"

FROM php:7.3
RUN apt-get update -y \
  && apt-get install -y \
      libxml2-dev \
      vim \
  && apt-get clean -y \
  && docker-php-ext-install soap  \
  && docker-php-ext-enable soap 

我以分离模式运行:docker-compose up -d.

当我从 Dockerfile 构建时,我错过了一步吗?是否缺少配置?

谢谢。

标签: dockerdocker-composedockerfile

解决方案


您可能需要详细了解multi-stage build

对于多阶段构建,您可以在 Dockerfile 中使用多个 FROM 语句。每个 FROM 指令都可以使用不同的基础,并且它们中的每一个都开始构建的新阶段。您可以选择性地将工件从一个阶段复制到另一个阶段,从而在最终图像中留下您不想要的一切。为了展示它是如何工作的,让我们调整上一节中的 Dockerfile 以使用多阶段构建。

上面的意思是,除非你明确地将前一阶段的东西复制到下一阶段,否则上一阶段的项目将不会在下一阶段看到。对您而言,当您定义 时FROM php:7.3,这意味着您的最终图像将基于php:7.3,与 无关wordpress

接下来你得到:

mz-docker-dev_wordpress_1 docker-php-entrypoint php -a 退出 0

这是因为php:7.3的入口点是"docker-php-entrypoint",如果没有前台进程,容器将在运行入口点后直接退出。

所以,对你来说,只需删除FROM php:7.3,基于wordpress图像来做你的定制作品就是解决方案。


推荐阅读