【问题标题】:Convert simple Dockerfile to docker-compose将简单的 Dockerfile 转换为 docker-compose
【发布时间】:2020-09-16 02:09:45
【问题描述】:

我有一个简单的Dockerfile 用于php:7.2-fpm,我的docker-compose.yml 配置引用了它。我想摆脱位于php/DockerfileDockerfile 并将命令集成到我的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

    phpmyadmin:
        container_name: dev_pma
        image: phpmyadmin/phpmyadmin
        links:
            - mysql
        depends_on:
            - mysql
        environment:
            PMA_HOST: mysql
            PMA_PORT: 3306
            PMA_ARBITRARY: 1
        restart: always
        ports:
            - 8183:80

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

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}
    command: bash -c "docker-php-ext-install mysqli"

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

想法?

【问题讨论】:

    标签: php docker docker-compose dockerfile


    【解决方案1】:

    您原来的 Dockerfile 不仅仅是安装 mysqli 扩展。

    它的入口点如源代码here所示

    它还有here所示的命令

    这些入口点和命令将启动容器并使其保持运行


    现在回到你的修改:

    我可以看到 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。

    1. 一个好的副作用是 Docker 会缓存构建层,因此您无需每次启动容器时都等待mysqli 的安装过程。
    2. 你也可以考虑enabling这个扩展

    【讨论】:

    • 我不想继续使用 Dockerfile 的最大原因是,当我通过docker image ls 检查系统使用哪些软件包时,php 不显示,因为它仅引用自Dockerfile。没什么大不了的,但很高兴知道我用的是什么。
    • 您知道可以将imagebuild 标志一起使用吗?在这种情况下,docker 将构建镜像并将镜像名称保存为image 标志的值。您可以在此处参考文档:docs.docker.com/compose/compose-file/#build
    猜你喜欢
    • 2017-09-06
    • 1970-01-01
    • 1970-01-01
    • 2020-06-12
    • 2021-08-21
    • 1970-01-01
    • 1970-01-01
    • 2019-08-06
    • 1970-01-01
    相关资源
    最近更新 更多