Docker Compose 服务量未反映我的主机对正在运行的容器的更改

Kod*_*.Me 3 docker dockerfile docker-compose

我并不是一个真正有经验的 Docker 用户,我面临着一个无法解决的奇怪问题。

我尝试做的是使用docker-compose.yml. 这三个服务是一个MySQLServer、一个PHP-FPM和一个nGinx服务器。

到目前为止,我已经实现了运行服务,并且我可以执行我想要的所有操作,例如在容器内运行迁移文件、在数据库中添加固定数据等。

我使用以下配置时遇到的唯一问题是我对主机文件所做的更改没有反映在正在运行的容器中。

如果我停止 docker-compose 并重新启动它,那么我可以看到主机发生变化,但在容器运行时我看不到这些变化。

在以下文件中,您发现我的配置有任何错误吗?我进行了很多搜索,但不幸的是,我找不到任何解决方案。

我的docker-compose.yml文件看起来像这样:

version: "3.9"

services:
    mysql:
        image: mysql:8.0
        volumes:
            - ./docker/mysql/init:/docker-entrypoint-initdb.d
            - .data:/var/lib/mysql
        environment:
            MYSQL_ROOT_PASSWORD: root
            MYSQL_DATABASE: api

    php:
        build:
            context: .
        env_file:
            - .env
        ports:
            - "9000:9000"
        volumes:
            - ./:/srv/api

    web:
        image: nginx:latest
        ports:
            - "8080:80"
        volumes:
            - ./:/srv/api
            - ./docker/nginx/site.conf:/etc/nginx/conf.d/default.conf

Run Code Online (Sandbox Code Playgroud)

对于以下PHP内容Dockerfile

# the different stages of this Dockerfile are meant to be built into separate images
# https://docs.docker.com/develop/develop-images/multistage-build/#stop-at-a-specific-build-stage
# https://docs.docker.com/compose/compose-file/#target


# https://docs.docker.com/engine/reference/builder/#understand-how-arg-and-from-interact
ARG PHP_VERSION=8.0.9

# "php" stage
FROM php:${PHP_VERSION}-fpm-alpine AS api_platform_php

# persistent / runtime deps
RUN apk add --no-cache \
        acl \
        fcgi \
        file \
        gettext \
        git \
        gnu-libiconv \
    ;

# install gnu-libiconv and set LD_PRELOAD env to make iconv work fully on Alpine image.
# see https://github.com/docker-library/php/issues/240#issuecomment-763112749
ENV LD_PRELOAD /usr/lib/preloadable_libiconv.so

ARG APCU_VERSION=5.1.19
RUN set -eux; \
    apk add --no-cache --virtual .build-deps \
        $PHPIZE_DEPS \
        icu-dev \
        libzip-dev \
        mysql-dev \
        zlib-dev \
    ; \
    \
    docker-php-ext-configure zip; \
    docker-php-ext-install pdo pdo_mysql; \
    docker-php-ext-install -j$(nproc) \
        intl \
        zip \
    ; \
    pecl install \
        apcu-${APCU_VERSION} \
    ; \
    pecl clear-cache; \
    docker-php-ext-enable \
        apcu \
        opcache \
    ; \
    \
    runDeps="$( \
        scanelf --needed --nobanner --format '%n#p' --recursive /usr/local/lib/php/extensions \
            | tr ',' '\n' \
            | sort -u \
            | awk 'system("[ -e /usr/local/lib/" $1 " ]") == 0 { next } { print "so:" $1 }' \
    )"; \
    apk add --no-cache --virtual .api-phpexts-rundeps $runDeps; \
    \
    apk del .build-deps

###> recipes ###
###< recipes ###

COPY --from=composer:2 /usr/bin/composer /usr/bin/composer

RUN ln -s $PHP_INI_DIR/php.ini-production $PHP_INI_DIR/php.ini
COPY docker/php/conf.d/api-platform.prod.ini $PHP_INI_DIR/conf.d/api-platform.ini

VOLUME /var/run/php

# https://getcomposer.org/doc/03-cli.md#composer-allow-superuser
ENV COMPOSER_ALLOW_SUPERUSER=1
ENV PATH="${PATH}:/root/.composer/vendor/bin"

WORKDIR /srv/api

# build for production
ARG APP_ENV=prod

# prevent the reinstallation of vendors at every changes in the source code
COPY composer.json composer.lock symfony.lock ./
RUN set -eux; \
    composer install --prefer-dist --no-dev --no-scripts --no-progress; \
    composer clear-cache

# copy only specifically what we need
COPY .env ./
ADD bin bin/
COPY config config/
COPY migrations migrations/
COPY public public/
COPY src src/
COPY templates templates/
COPY ./ ./


COPY docker/php/docker-healthcheck.sh /usr/local/bin/docker-healthcheck
RUN chmod +x /usr/local/bin/docker-healthcheck

HEALTHCHECK --interval=10s --timeout=3s --retries=3 CMD ["docker-healthcheck"]

COPY docker/php/docker-entrypoint.sh /usr/local/bin/docker-entrypoint
RUN chmod +x /usr/local/bin/docker-entrypoint

ENV SYMFONY_PHPUNIT_VERSION=9

CMD ["php-fpm"]

WORKDIR /srv/api

EXPOSE 9000
Run Code Online (Sandbox Code Playgroud)

最后我的本地文件系统是这样的:

/bin
/config
/docker
    /mysql
        /init
            init-script.sql
    /nginx
        site.conf
    /php
        /conf.d
            api-platform.dev.ini
            api-platform.prod.ini
        /php-fpm.d
            zz-docker.conf
        docker-entrypoint.sh
        docker-healthcheck.sh
/migrations
/public
    /bundles
    [...]
    index.php
    [...]
/src
    /Controller
    /DataFixtures
    /Entity
    /EventSubscriber
    /Exception
    /OpenApi
    /Repository
    /Security
    /Serializer
    /Validation
    Kernel.php
/templates
/tests
/var
/vendor
.env
[...]
docker-compose.yml
Dockerfile
[...]
Run Code Online (Sandbox Code Playgroud)

dig*_*orn 5

我在 Mac 上遇到了类似的问题 - 结果证明这与 Docker Desktop 中启用“使用 gRPC FUSE 进行文件共享”的选项有关。禁用此选项后,我可以在主机上添加和编辑文件,并查看容器中反映的更新,而无需停止和启动容器。

Docker 偏好设置