簡體   English   中英

將簡單的 Dockerfile 轉換為 docker-compose

[英]Convert simple Dockerfile to docker-compose

我有一個用於php:7.2-fpm的簡單Dockerfile ,我docker-compose.yml配置正在引用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

    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"

但這不起作用。 當我使用dev_php docker-compose up我的項目時docker-compose up我可以看到dev_php (PHP 容器的名稱)執行了一堆我通常看不到的任務,然后它繼續安裝mysqli但隨后立即退出, exit code 0 .

想法?

您的原始 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. 您也可以考慮啟用擴展

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM