我正在尝试在单个 Docker 容器中部署 React 应用程序,该容器能够在 OpenShift 平台上通过 dev、preprod 和 prod 运行,在该平台上我只能推送标记的 docker 镜像。为了做到这一点,我有:
- 使用托管在 Github 上的 create-react-app 生成的 React 应用程序
- 项目根目录下的 Dockerfile 包含 docker build/run 过程
- 包含持续集成检查和部署方法的 .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;'