将简单的 Dockerfile 转换为 docker-compose

我有一个简单的Dockerfile配置php:7.2-fpm正在引用它docker-compose.yml。我想删除Dockerfile位于php/Dockerfile并将命令集成到我的docker-compose-yml文件中。

这是我的php/Dockerfile

FROM php:7.2-fpm
RUN docker-php-ext-install mysqli

这是我的docker-compose.yml,它启动了 php-fpm、nginx、letencrypt certbot、mysql 和 phpmyadmin:

version: '3'


services:

    php:

        container_name: dev_php

        build:

            context: ./php

        ports:

            - 9000:9000

        volumes:

            - ./website:/website

            - ./php/www.conf:/usr/local/etc/php-fpm.d/www.conf

        environment:

            MYSQL_USER: ${MYSQL_USER}

            MYSQL_PASSWORD: ${MYSQL_PASSWORD}


    nginx:

        container_name: dev_nginx

        image: nginx:1.13.8

        ports:

            - 80:80

            - 443:443

        volumes:

            - ./website:/website

            - ./nginx/default.conf:/etc/nginx/conf.d/default.conf

            - ./certbot/conf:/etc/letsencrypt

            - ./certbot/www:/var/www/certbot

        depends_on:

            - php

            - mysql

        command: "/bin/sh -c 'while :; do sleep 6h & wait $${!}; nginx -s reload; done & nginx -g \"daemon off;\"'"


    certbot:

        container_name: dev_certbot

        image: certbot/certbot

        volumes:

            - ./certbot/conf:/etc/letsencrypt

            - ./certbot/www:/var/www/certbot

        entrypoint: "/bin/sh -c 'trap exit TERM; while :; do certbot renew; sleep 12h & wait $${!}; done;'"


    mysql:

        container_name: dev_mysql

        image: mysql:5.7

        ports:

            - 3306:3306

        environment:

            MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD}

            MYSQL_DATABASE: ${MYSQL_DATABASE}

            MYSQL_USER: ${MYSQL_USER}

            MYSQL_PASSWORD: ${MYSQL_PASSWORD}

        volumes:

            - ./mysql:/docker-entrypoint-initdb.d


由于我的php/Dockerfile比较简单,我想我可以这样做:


但这是行不通的。当我使用我的项目启动时,docker-compose up我可以看到dev_php(PHP 容器的名称)执行了一堆我通常不会看到的任务,然后它继续安装,mysqli但在使用exit code 0.


想法?


墨色风雨
浏览 83回答 1
1回答

largeQ

您的原始 Dockerfile 不仅仅只是安装扩展mysqli。它的入口点如源代码所示它还具有如下所示的命令这些入口点和命令将启动容器并保持其运行现在回到您的修改:我可以看到 dev_php (PHP 容器的名称)执行了一堆我通常不会看到的任务这是 的输出docker-php-ext-install mysqli。你之前没有看到它是因为它是在构建 docker 镜像时完成的。退出后立即退出,退出代码为 0这是预期的,因为命令已完成处理,没有其他事情可做。为了保持容器运行,您必须手动添加原始入口点和命令。像这样的事情:php:     container_name: dev_php     image: php:7.2-fpm     ports:         - 9000:9000     volumes:         - ./website:/website         - ./php/www.conf:/usr/local/etc/php-fpm.d/www.conf     environment:         MYSQL_USER: ${MYSQL_USER}         MYSQL_PASSWORD: ${MYSQL_PASSWORD}     entrypoint:         - bash         - -c     command:         - |           docker-php-ext-install mysqli; \           docker-php-entrypoint php-fpm我尚未进行测试来确认语法 100% 正确,但您应该明白了。重要的是docker-php-entrypoint php-fpm我的建议是在这种情况下坚持使用 Dockerfile。一个好的副作用是 Docker 会缓存构建层,因此您无需mysqli每次启动容器时都等待安装过程。您也可以考虑启用扩展
打开App,查看更多内容
随时随地看视频慕课网APP