2017-09-13 47 views
0
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项目以及reactjs代码不存在于图像上,需要在能够构建(js)/ install(golang)之前进行复制。有没有办法在将文件复制到图像之前执行构建/安装过程?理想情况下,我只需要复制golang可执行文件和reactjs生成版本。Dockerfile:如何在将所需文件复制到图像之前构建项目?

+0

为什么你要复制所需的文件夹之前建立? –

+0

在图像“FROM golang:1.8”上构建“go install”,然后复制(仅bin)到不同的图像“FROM alpine” – itiic

+0

@JinnaBalu我希望最终图像只有一个golang可执行文件和reactjs的生成版本文件夹以最小化容器大小。看起来,多阶段构建是我走的路,当我有机会的时候,我会投入一些。 – irregular

回答

1

是的,现在可以使用多阶段构建。这个想法是,你可以在你的docker文件中有多个FROM,并且你的主图像将使用最后一个FROM来构建。下面是一个示例伪结构

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 

请阅读以下文章了解更多详情

https://docs.docker.com/engine/userguide/eng-image/multistage-build/

+0

我经常在例子中看到'alpine'。那是因为它是容器最轻量级的图像吗?还有其他原因吗? – irregular

+0

是的光线,给你比临时图像更多的功能。你获得基本的Unix命令 –

相关问题