在创建Docker映像之前先构建前端

时间:2020-02-04 13:44:41

标签: java reactjs docker npm dockerfile

我是Docker的新手,目前正在研究使某些应用程序化。

项目结构:

-PlayProject

-------app
----------controllers
----------models
----------views

-------ci
-------conf
-------project

-------public
----------css
----------js
----------img
----------fonts

-------sbt-cache
-------src
-------target

-------front
------------header (npm folder)
------------footer (npm folder)
-------Dockerfile
----*

该项目是通过后端的PlayFramework(以sbt作为构建工具)和前端的Reactjs开发的。前端由gtwo模块(页眉和页脚)组成。

在我的dockerfile上,我需要先运行构建模块(在文件夹的页眉和页脚中同时运行'npm run build'命令)以更新公共文件夹,然后再进行替换

我的Dockerfile:

FROM openjdk:8

ENV HEADER front/header
ENV FOOTER front/footer
ENV PROJECT_HOME /usr/src
ENV SBT_VERSION 1.2.1

#install node
RUN  \
        curl -sL https://deb.nodesource.com/setup_4.x | bash  && \
        # and install node
        apt-get update && \
        apt-get install nodejs && \
        # confirm that it was successful
        node -v && \
        # npm installs automatically
        npm -v

WORKDIR $HEADER/

RUN  \
         echo $(ls -1 $HEADER/) && \
        npm cache clean && \
        npm i && \
        npm run build

WORKDIR $FOOTER/

RUN \
        echo $(ls -1 $FOOTER/) && \
        npm cache clean && \
        npm i && \
        npm run build


RUN mkdir -p $PROJECT_HOME/sbt $PROJECT_HOME/app

WORKDIR $PROJECT_HOME/sbt

# Install curl
RUN \
       apt-get update && \
       apt-get -y install curl && \
       apt-get -y install vim

# Install sbt
RUN \
        curl -L -o sbt-$SBT_VERSION.deb https://dl.bintray.com/sbt/debian/sbt-$SBT_VERSION.deb && \
        dpkg -i sbt-$SBT_VERSION.deb && \
        rm sbt-$SBT_VERSION.deb && \
        apt-get update && \
        apt-get -y install sbt


COPY . $PROJECT_HOME/app
WORKDIR $PROJECT_HOME/app

EXPOSE 9000

问题是我无法本地化前文件夹并运行我的npm命令。你怎么看?

2 个答案:

答案 0 :(得分:2)

看起来您实际上并没有将本地源发送到Docker容器,因此没有任何构建。

在切换WORKDIR之前,尝试添加类似COPY . .的行。

答案 1 :(得分:0)

您没有为第一个WORKDIR指令设置绝对路径:

WORKDIR指令可在Dockerfile中多次使用。如果提供了相对路径,则它将相对于上一个WORKDIR指令的路径。例如:

WORKDIR / a

WORKDIR b

WORKDIR c

运行密码

此Dockerfile中最后一个pwd命令的输出为/ a / b / c。

quoted from here

也许您想像这样替换第一个WORKDIR:

WORKDIR $PROJECT_HOME/$HEADER
COPY . .
# instead of just WORKDIR $HEADER/