【发布时间】:2019-04-06 14:05:37
【问题描述】:
我正在尝试在单个 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;'
【问题讨论】:
-
这个没有工匠?
-
buildWithEnv.sh 中的环境特定部分在哪里/docker-image 中的环境特定部分是什么?无论如何,你的
buildWithEnv.sh脚本的内容肯定应该移到 Dockerfile 中,除了最后一行。npm install,npm run build应该是 docker-build 的一部分,而不是在容器启动时运行
标签: reactjs docker continuous-integration environment-variables