Dockerfile:在将所需文件复制到映像之前,如何构建项目?

Dockerfile:在将所需文件复制到映像之前,如何构建项目?,docker,dockerfile,Docker,Dockerfile,一开始,golang项目以及reactjs代码在映像上不存在,需要在能够构建(js)/安装(golang)之前进行复制。在将文件复制到映像之前,是否有一种方法可以完成构建/安装过程?理想情况下,我只需要复制golang可执行文件和reactjs生产版本。是的,现在可以使用多阶段版本。其思想是,您可以在docker文件中包含多个FROM,并且您的主映像将使用最后一个FROM构建。下面是一个伪结构示例 FROM golang:1.8 RUN apt-get -y update &&

一开始,golang项目以及reactjs代码在映像上不存在,需要在能够构建(js)/安装(golang)之前进行复制。在将文件复制到映像之前,是否有一种方法可以完成构建/安装过程?理想情况下,我只需要复制golang可执行文件和reactjs生产版本。

是的,现在可以使用多阶段版本。其思想是,您可以在docker文件中包含多个FROM,并且您的主映像将使用最后一个FROM构建。下面是一个伪结构示例

FROM golang:1.8

RUN apt-get -y update && apt-get install -y curl

RUN go get -u github.com/gorilla/mux

RUN go get github.com/mattn/go-sqlite3

RUN curl -sL https://deb.nodesource.com/setup_6.x | bash - && \
    apt-get install -y nodejs

COPY . /go/src/beginnerapp

WORKDIR ./src/beginnerapp/beginner-app-react

RUN npm run build

RUN go install beginnerapp/

WORKDIR /go/src/beginnerapp/beginner-app-react

VOLUME /go/src/beginnerapp/local-db

WORKDIR /go/src/beginnerapp

ENTRYPOINT /go/bin/beginnerapp

EXPOSE 8080
请阅读下面的文章了解更多细节


为什么要在复制所需文件夹之前进行生成?从golang:1.8在映像上生成“go install”,然后从alpine@JinnaBalu将(仅箱子)复制到不同的映像上。我希望最终映像只包含一个golang可执行文件和reactjs文件夹的生产生成,以最小化容器大小。似乎多阶段构建是一种方法,如果有机会,我会尝试一下。我看到
alpine
在示例中经常使用。这是因为它是容器中最轻量级的映像吗?还有其他原因吗?是的,它比刮擦图像更轻,给你更多的功能。您可以使用基本的unix命令
FROM node:latest as reactbuild
WORKDIR /app
COPY . .
RUN webpack build

FROM golang:latest as gobuild
WORKDIR /app
COPY . .
RUN go build

FROM alpine
WORKDIR /app
COPY --from=gobuild /app/myapp /app/myapp
COPY --from=reactbuild /app/dist /app/dist