我正在尝试在单个 Docker 容器中部署一个 React 应用程序,该容器能够在 OpenShift 平台上运行 dev、preprod 和 prod,在该平台上我只能推送标记的 docker 镜像。为了做到这一点我有:
- 使用 Github 上托管的 create-react-app 生成的 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;'
在此描述了一种可能的方法博客文章 https://blog.manifold.co/building-a-production-grade-container-for-your-static-javascript-application-b2b2eff83fbd
基本上:您对静态资源中的所有环境特定部分使用占位符。然后你配置nginx'sub_filter https://nginx.org/en/docs/http/ngx_http_sub_module.html在运行时用环境特定值替换这些值。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)