gpt4 book ai didi

Docker Compose 服务卷不反射(reflect)我的主机对正在运行的容器的更改

转载 作者:行者123 更新时间:2023-12-05 02:39:13 26 4
gpt4 key购买 nike

我不是真正有经验的 Docker 用户,我遇到了一个我无法解决的奇怪问题。

我尝试做的是使用 docker-compose.yml 运行三个服务。这三个服务是 MySQL 服务器、PHP-FPMnGinx 服务器。

到目前为止,我已经实现了运行服务,我可以做我想做的所有操作,比如在容器中运行迁移文件,在数据库中添加 fixtures 数据等。

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

如果我停止 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

对于 PHPDockerfile 如下:

# 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

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

/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
[...]

最佳答案

它应该与您的 Dockerfile 无关。

也许出于某种原因,您的坐骑默认为 :delegated 模式。

尝试将 :consistent 添加到您的音量规范中,如:

- ./docker/nginx/site.conf:/etc/nginx/conf.d/default.conf:consistent

来自文档:

  • 一致:完美的一致性(主机和容器在任何时候都具有相同的挂载 View )
  • 已缓存:主机的 View 是权威的(在主机上的更新出现在容器中之前允许延迟)
  • 委托(delegate):容器的 View 是权威的(在容器更新出现在主机中之前允许延迟)

编辑:查看这个(长)线程:https://github.com/docker/for-win/issues/5530 (它最初是一个 Windows 问题,但 Ubuntu 用户在线程中报告了同样的问题)。

它与您的问题有很多共同之处,包括 PHP 和多个使用同一主机文件夹作为卷的容器。这似乎是一个与非常频繁的文件更新和缓存系统有关的错误。对于某些人来说,添加 :consistent 有效,而对于某些人则不然。错误报告现已关闭 - 它似乎已修复,即使很难我最后也看不到非常明显的解释。我确实建议确保您的 Docker/docker-compose 部署是最新的。

关于Docker Compose 服务卷不反射(reflect)我的主机对正在运行的容器的更改,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69188425/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com