我最近在学习 docker,并尝试将现有的 Web 应用程序转换为容器。但是,几天来我一直收到一致的错误,但仍未解决。该项目在本地和 AWS Elastic Beanstalk(通过 CodePipeline)上运行得很好。只是在 docker 上,它受到这个错误的困扰,这甚至没有意义。
如果您可以看到下图,则错误与第 51 行(之前的第 50 行)有关;所以我在第 44 行添加了 dd,但错误引用了第 50 行,甚至没有触发 dd(第 44 行),然后仍然在第 51 行显示错误(之前添加 dd 之前是第 50 行)。几天来,当我利用空闲时间研究这个问题时,我一直在摸索这个问题。这对我来说毫无意义。
我想指出,composer install、npm install 和 npm run build 都成功了。 public、node_modules和vendor文件夹都添加到dockerignore和gitignore中。因此它们都是在运行时生成/编译的,然后由 fpm 和 nginx 提供服务。这些文件都不会从我的本地或存储库复制到容器中。 (并且)我也尝试将它们添加到存储库(供应商和 npm run build 后的公共文件夹),但我仍然遇到同样的错误。
docker-compose.yml
services:
server:
container_name: server
platform: linux/amd64
image: xxxx/xxmy-private-repoxx
build:
context: .
dockerfile: Dockerfile
restart: unless-stopped
tty: true
working_dir: /var/www
volumes:
- /var/www
ports:
- "11001:9000"
Dockerfile
FROM php:8.1-fpm as stage-php
# set working directory
WORKDIR /var/www
# install dependencies
RUN --mount=type=cache,target=/var/cache/apt \
apt-get update -y \
&& apt-get install -y curl unzip libsodium-dev libpq-dev libcurl4-gnutls-dev libonig-dev zlib1g-dev libpng-dev libc-client-dev libkrb5-dev libicu-dev libzip-dev libxslt-dev software-properties-common nginx npm
# install php extensions and cleanup
RUN --mount=type=cache,target=/var/cache/apt \
docker-php-ext-configure gd \
&& docker-php-ext-configure imap --with-kerberos --with-imap-ssl \
&& docker-php-ext-configure zip \
&& docker-php-ext-install gd soap sodium imap intl mysqli xsl pdo pdo_mysql bcmath curl opcache mbstring zip \
&& apt autoremove -y \
&& apt clean \
&& rm -rf /var/lib/apt/lists/*
# set default user and group
RUN usermod --uid 1000 www-data \
&& groupmod --gid 1000 www-data
# composer and install
COPY --chown=www-data:www-data . /var/www
COPY --from=composer:2.7.2 /usr/bin/composer /usr/bin/composer
# transfer custom configs
COPY ./docker/php/php.ini /usr/local/etc/php/php.ini
COPY ./docker/php/php-fpm.conf /usr/local/etc/php-fpm.d/www.conf
COPY ./docker/php/zz-docker.conf /usr/local/etc/php-fpm.d/zz-docker.conf
COPY ./docker/nginx/fastcgi_params /etc/nginx/fastcgi_params
COPY ./docker/nginx/nginx.conf /etc/nginx/nginx.conf
COPY ./docker/php/entrypoint.sh /app-container-entrypoint.sh
RUN chmod +x /app-container-entrypoint.sh
ENTRYPOINT ["/app-container-entrypoint.sh"]
entrypoint.sh
#!/bin/bash
#if [ ! -f "vendor/autoload.php" ]; then
composer install --no-progress --no-interaction
chown -R www-data:www-data /var/www/vendor
npm install
chown -R www-data:www-data /var/www/node_modules
npm run build
chown -R www-data:www-data /var/www/public
#fi
php-fpm -D
nginx -g "daemon off;"
希望有人能指出我解决此问题的正确方向。这是阻止我继续将其他网络应用程序转换为容器的唯一因素。
神圣的。我能够让它发挥作用。我不敢相信这只是因为 opcache。我所要做的就是设置
opcache.enable=0
php.ini
[opcache]
opcache.enable=1
opcache.memory_consumption=512
opcache.interned_strings_buffer=64
opcache.max_accelerated_files=50000
opcache.max_wasted_percentage=15
opcache.validate_timestamps=0
opcache.revalidate_freq=0
opcache.save_comments=0
opcache.fast_shutdown=1
我对opcache配置不太熟悉,我只是将其复制到某个地方并稍微增加了一些值(内存消耗和interned_strings_buffer);以前工作得很好。我什至注意到加载时间略有减少(120-140 毫秒到 20-60 毫秒)。
如果有熟悉这一点的人,我希望有人能解释一下。