我正试图在一个Docker容器中部署React应用程序,该容器能够在OpenShift平台上运行dev、prerod和prod,在该平台上我只能推送标记的Docker映像。为了做到这一点,我有:
- 使用托管在Github上的create-rect应用程序生成的React应用程序
- 项目根目录下的Dockerfile,包含docker构建/运行过程
- 包含连续集成检查和部署方法的.gitlab-ci.yml文件
- 可访问的OpenShift平台
我能做什么:
我可以很容易地生成一个生产构建"/build",它将被添加到docker镜像构建阶段,并将与生产上下文一起运行,或者我可以在运行开始时进行构建(但只是编写它感觉很糟糕(。
问题:
这个生成的映像不能在所有环境中运行,我不想为每个环境都有一个特定的构建。
我想要什么:
我希望能够生成一个能够在所有环境中运行的docker映像,而不必安装依赖项或在只需要run时进行构建。
这是我的Dockerfile:
FROM nginx:1.15.5-alpine
RUN addgroup --system app
&& adduser --uid 1001 --system --ingroup app app
&& rm -rf /etc/nginx/conf.d/default.conf
&& apk add --update nodejs nodejs-npm
&& mkdir /apptmp
COPY . /apptmp
RUN chmod 777 /apptmp
COPY config/default.conf /etc/nginx/conf.d/
COPY config/buildWithEnv.sh .
RUN touch /var/run/nginx.pid &&
chown -R app:app /var/run/nginx.pid &&
chown -R app:app /var/cache/nginx &&
chown -R app:app /usr/share/nginx/html
EXPOSE 8080
USER 1001
CMD sh buildWithEnv.sh
这是脚本buildWithEnv.sh
#!/bin/bash
echo "===> Changin directory: /apptmp ..."
cd /apptmp
echo "===> Installing dependencies: npm install ..."
npm install
echo "===> Building application: npm run build ..."
npm run build
echo "===> Copying to exposed html folder ... "
rm -rf /usr/share/nginx/html/*
cp -r build/* /usr/share/nginx/html/
echo "===> Launching http server ... "
nginx -g 'daemon off;'
这篇博客文章描述了一种可能的方法
基本上:静态资源中所有特定于环境的部分都使用占位符。然后配置nginx的sub_filter
,以在运行时用特定于环境的值替换这些值。
我终于找到了一种方法。
生成应用程序
第一步是对应用程序进行静态构建,与环境无关。(实际上,在我的情况下,这是由CI完成的,所以我直接在Docker构建部分检索静态构建(
创建Nginx conf
在您的项目中,创建一个文件,其中包含nginx的默认配置,以及您需要的反向代理配置,并用可轻松唯一地重新分配的值填充proxy_pass
。
server {
gzip on;
gzip_types text/plain application/xml application/json;
gzip_vary on;
listen 8080;
location / {
root /usr/share/nginx/html;
index index.html index.htm;
try_files $uri $uri/ /index.html;
}
location /api/ {
proxy_set_header x-clientapikey REACT_APP_BAMBOO_API_KEY;
proxy_pass REACT_APP_SERVICE_BACK_URL;
}
location /auth {
proxy_set_header Authorization "Basic REACT_APP_AUTHENTIFICATION_AUTHORIZATION";
proxy_pass REACT_APP_SERVICE_AUTH_URL;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
}
Openshift配置
在OC应用程序中,转到"environment"选项卡,添加将在nginx conf中使用的所有环境变量。
Dockerfile构建
在dockerfile构建部分,将构建移到nginx html文件夹中的正确位置,并处理您的配置文件,包括nginx。
FROM nginx:1.15.5-alpine
RUN addgroup --system app
&& adduser --uid 1001 --system --ingroup app app
&& rm -rf /etc/nginx/conf.d/default.conf
&& apk --update add sed
COPY ./build /usr/share/nginx/html/
COPY config/default.conf /etc/nginx/conf.d/
RUN chmod 777 -R /etc/nginx/conf.d/
COPY config/nginxSetup.sh .
RUN touch /var/run/nginx.pid &&
chown -R app:app /var/run/nginx.pid &&
chown -R app:app /var/cache/nginx &&
chown -R app:app /usr/share/nginx/html
EXPOSE 8080
USER 1001
CMD sh nginxSetup.sh
Dockerfile运行
在dockerfile运行部分(CMD(中,只需使用命令行工具sed
来替换nginx反向代理配置中的路径。
#!/usr/bin/env bash
sed -i "s|REACT_APP_SERVICE_BACK_URL|${REACT_APP_SERVICE_BACK_URL}|g" /etc/nginx/conf.d/default.conf
sed -i "s|REACT_APP_SERVICE_AUTH_URL|${REACT_APP_SERVICE_AUTH_URL}|g" /etc/nginx/conf.d/default.conf
sed -i "s|REACT_APP_BAMBOO_API_KEY|${REACT_APP_BAMBOO_API_KEY}|g" /etc/nginx/conf.d/default.conf
sed -i "s|REACT_APP_AUTHENTIFICATION_AUTHORIZATION|${REACT_APP_AUTHENTIFICATION_AUTHORIZATION}|g" /etc/nginx/conf.d/default.conf
echo "===> Launching http server ... "
nginx -g 'daemon off;'
你来了。