为了账号安全,请及时绑定邮箱和手机立即绑定

将简单的 Dockerfile 转换为 docker-compose

将简单的 Dockerfile 转换为 docker-compose

PHP
墨色风雨 2024-01-19 20:59:45
我有一个简单的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.想法?
查看完整描述

1 回答

?
largeQ

TA贡献2039条经验 获得超7个赞

您的原始 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。

  1. 一个好的副作用是 Docker 会缓存构建层,因此您无需mysqli每次启动容器时都等待安装过程。

  2. 您也可以考虑启用扩展


查看完整回答
反对 回复 2024-01-19
  • 1 回答
  • 0 关注
  • 74 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信