Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/255.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用PHP对应用程序进行响应。Dockerfile实现_Php_Html_Docker_Kubernetes_Dockerfile - Fatal编程技术网

使用PHP对应用程序进行响应。Dockerfile实现

使用PHP对应用程序进行响应。Dockerfile实现,php,html,docker,kubernetes,dockerfile,Php,Html,Docker,Kubernetes,Dockerfile,我正在将我的应用程序从Azure应用程序服务移动到Azure Kubernetes服务,我需要对其进行dockerize。这是一个简单的typescript/react应用程序。我通常会按照以下顺序构建和运行它: yarn yarn staging serve -s build -l 5000 然而,有一点扭曲。我有几个php页面需要支持。我如何将所有流量路由到/index.html,除了到达*.php的请求-这些请求需要作为php脚本处理。Azure应用程序服务允许我用PHP并排运行HTML

我正在将我的应用程序从Azure应用程序服务移动到Azure Kubernetes服务,我需要对其进行dockerize。这是一个简单的typescript/react应用程序。我通常会按照以下顺序构建和运行它:

yarn
yarn staging
serve -s build -l 5000
然而,有一点扭曲。我有几个
php
页面需要支持。我如何将所有流量路由到
/index.html
,除了到达
*.php
的请求-这些请求需要作为php脚本处理。Azure应用程序服务允许我用PHP并排运行HTML5应用程序。我如何使用docker实现它?我的Dockerfile应该是什么样子

以下是我目前的想法:

# Step 1
FROM node:10-alpine as build-step
RUN mkdir /app
WORKDIR /app
COPY . /app

RUN yarn
RUN yarn staging

# Stage 2
FROM php:7.2-apache
COPY --from=build-step /app/build /var/www/html
EXPOSE 80
CMD ["/usr/sbin/apache2ctl", "-D", "FOREGROUND"]

但是如果我打开它,它不会重定向到/index.html。

经过所有的研究,我成功地实现了所需的行为,即:

  • 用纱线构建react应用程序
  • 单页应用程序URL重写
  • 启用PHP。我可以打开http://*.php网页
  • 打开/webpage,如果有webpage.php,它将打开php
我的最后一个Dockerfile:

# Build
FROM node:10-alpine as build

ARG envType=staging

RUN echo ${envType}

RUN mkdir /app

WORKDIR /app

COPY . /app

RUN yarn

RUN yarn ${envType}

# Run
FROM php:7.3-apache

COPY --from=build /app/build /var/www/html

RUN a2enmod rewrite

EXPOSE 80
和.htaccess文件,具有重写规则:

<ifModule mod_rewrite.c>
    RewriteEngine On

    # check to see if the request is for a PHP file:
    RewriteCond %{REQUEST_FILENAME}\.php -f
    RewriteRule ^/?(.*)$ /$1.php [L]

    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_URI} !index
    RewriteRule (.*) index.html [L]
</ifModule>

重新启动发动机
#检查请求是否针对PHP文件:
重写cond%{REQUEST_FILENAME}\.php-f
重写规则^/?(.*)$/$1.php[L]
重写cond%{REQUEST_FILENAME}-F
重写cond%{REQUEST_FILENAME}-D
重写cond%{REQUEST_URI}!指数
重写规则(.*)index.html[L]

您想在同一个容器中执行此操作吗?@JayBlanchard是的,我想。请看我的dockerfile,因为它现在已经做了一些研究,我不确定你能做到这一点,而不是真正的黑客。更好的选择可能是另一个运行PHP脚本并返回结果的容器。或者使用类似SupervisorD的工具,以便可以在同一容器中运行多个服务。请在此处提供
docker ps
好吗?您应该构建静态HTML页面,而不是直接使用serve,这仅用于开发,一旦您拥有dist/build文件夹,您就可以将其与PHP文件一起提供,使用php apache或php fpm的docker映像,否则您将需要nginx之类的东西将所有内容重定向到您正在服务的端口,并将php重定向到php可执行文件。