我是 Docker 新手,想自己構建映像(nginx php-fpm mariadb phpadmin)。
我想要 Xdebug,所以我有一個 Dockerfile 來自定義 php-fpm 影像。
然后我在執行時遇到問題(與此處相同)
docker-compose --build
或者
docker-compose up --build
影像第一次構建得很好,但下一次它失敗了,因為 php-fpm 以某種方式結束了已經安裝的 xdebug:
pecl install xdebug
pecl/xdebug is already installed and is the same as the released version 3.1.5
install failed
就像影像來自快取,但仍然應用 Dockerfile。
我已經使用了該帖子中的解決方案,但我顯然遺漏了一些東西,它不應該是那樣的。我究竟做錯了什么?
我的碼頭工人撰寫:
version: "3.7"
services:
web:
image: nginx:1.17
ports:
- 8080:80
volumes:
- ../logs:/var/log/nginx/
- ../wordpress:/var/www/myapp
- type: bind
source: ./site.conf
target: /etc/nginx/conf.d/default.conf
depends_on:
- php
- mariadb
php:
image: php:7.4-fpm
build:
context: ./php
volumes:
- ../wordpress:/var/www/myapp
- type: bind
source: ./php/conf.d/xdebug.ini
target: /usr/local/etc/php/conf.d/docker-php-ext-xdebug.ini
- type: bind
source: ./php/conf.d/error_reporting.ini
target: /usr/local/etc/php/conf.d/error_reporting.ini
depends_on:
- mariadb
mariadb:
image: mariadb:10.4
restart: always
ports:
- 127.0.0.1:3308:3306
environment:
- MYSQL_ROOT_PASSWORD=4321
- MYSQL_DATABASE=wordpress
- MYSQL_USER=wordpress
- MYSQL_PASSWORD=1234
volumes:
- mariadb-data:/var/lib/mysql
phpmyadmin:
image: phpmyadmin/phpmyadmin:latest
ports:
- 8900:80
environment:
- PMA_ARBITRARY=1
- PMA_HOST=mariadb
depends_on:
- mariadb
volumes:
mariadb-data:
和我的 php-fpm dockerfile:
FROM php:7.4-fpm
RUN apt-get update && apt-get install -y \
libicu-dev\
openssl \
git \
unzip\
nano\
&& docker-php-ext-install \
intl pdo pdo_mysql mysqli\
&& docker-php-ext-enable \
intl pdo pdo_mysql
RUN bash -c '[[ -n "$(pecl list | grep xdebug)" ]]\
|| (pecl install xdebug && docker-php-ext-enable xdebug)'
uj5u.com熱心網友回復:
討論/解釋
我究竟做錯了什么?
也許這是對docker-compose.yml
模板的誤解,特別是關于php
服務的容器(基于php:7.4-fpm
),可能是錯誤引入的。
當您同時指定服務的 theimage
和build
屬性時,構建它時的影像將存盤在image
名稱下(另請參見后面的參考部分)。
當您命名image
as 時php:7.4-fpm
,那些構建映像存盤在本地(在您運行的地方docker-compose(1)
),并且您Dockerfile
在該構建背景關系中具有相同名稱的映像php:7.4-fpm
:
FROM php:7.4-fpm
# ...
那么當你第一次構建時,鏡像php:7.4-fpm
在本地是不可用的。然后它是從Docker Hub 獲取的構建,然后php:7.4-fpm
構建結果會在本地覆寫影像php:7.4-fpm
,因為您使用的是相同的名稱 (!)。
這很可能不是故意的。
這也可以解釋為什么--build
--force-recreate
也不起作用:Dockerfile
構建指令認為php:7.4-fpm
是要構建的映像,但它已經是(第一次本地構建的)結果。
解決方案
洗掉image
service 關鍵字。你不需要它,因為你有build
關鍵字。Docker Compose 會自動為您的專案中的鏡像命名(基于服務和專案名稱)。
services:
php:
build:
context: ./php
volumes:
- ../.:/var/www/myapp:ro
然后洗掉懸空/受污染的php:7.4-fpm
影像:
$ docker image rm php:7.4-fpm
這兩個步驟應該已經解決了您的問題,并使您的 docker 組合沒有錯誤。
此外,您可以洗掉解決方法并做一個簡單的pecl install xdebug && docker-php-ext-enable xdebug
,這里有更好的構建除錯能力(set -ex
):
FROM php:7.4-fpm
RUN set -ex ;\
apt-get update ;\
apt-get install -y \
libicu-dev\
openssl \
git \
unzip \
nano \
;\
docker-php-ext-install intl pdo pdo_mysql mysqli ;\
docker-php-ext-enable intl pdo pdo_mysql ;\
:
RUN set -ex ;\
pecl install xdebug ;\
docker-php-ext-enable xdebug ;\
:
您可以通過使FROM
影像成為構建引數來進一步調整它,將其系結到docker-composer.yml
模板中(并在其中使用變數和默認值)。我會讓你喜歡的。
參考
如果您指定
image
as ,則 Compose 使用 和中指定的可選build
名稱來命名構建的影像:webapp
tag
image
build: ./dir image: webapp:tag
這會生成一個名為
webapp
并標記為 的影像tag
,由 構建./dir
。
來自:https ://docs.docker.com/compose/compose-file/compose-file-v3/#build
uj5u.com熱心網友回復:
啟動容器時,您需要指示docker-compose
重建 dockerfile。
嘗試這個:
docker-compose up --build --force-recreate
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/492736.html
上一篇:使用php連接三個表并顯示值
下一篇:如何阻止用戶將數量留空?