1# Common builder
2ARG GO_IMAGE
3ARG BASE_IMAGE=centos:7
4FROM ${GO_IMAGE} as golang
5
6FROM ${BASE_IMAGE} as builder
7ENV GOPATH=/go
8ENV PATH $PATH:/usr/local/go/bin:$GOPATH/bin
9ENV AUTO_GOPATH 1
10COPY --from=golang /usr/local/go /usr/local/go
11COPY hack/dockerfile/install/tini.installer /
12COPY hack/dockerfile/install/proxy.installer /
13RUN yum install -y \
14    bash \
15    ca-certificates \
16    cmake \
17    gcc \
18    git \
19    glibc-static \
20    libtool \
21    make
22RUN grep "_COMMIT=" /*.installer  |cut -f2- -d: > /binaries-commits
23
24# dockerd
25FROM builder as dockerd-builder
26RUN yum install -y \
27    btrfs-progs-devel \
28    device-mapper-devel \
29    libseccomp-devel \
30    selinux-policy-devel \
31    systemd-devel
32WORKDIR /go/src/github.com/docker/docker
33COPY . /go/src/github.com/docker/docker
34ARG VERSION
35ARG GITCOMMIT
36ARG BUILDTIME
37ARG PLATFORM
38ARG PRODUCT
39ARG DEFAULT_PRODUCT_LICENSE
40ENV VERSION ${VERSION}
41ENV GITCOMMIT ${GITCOMMIT}
42ENV BUILDTIME ${BUILDTIME}
43ENV PLATFORM ${PLATFORM}
44ENV PRODUCT ${PRODUCT}
45ENV DEFAULT_PRODUCT_LICENSE ${DEFAULT_PRODUCT_LICENSE}
46# TODO The way we set the version could easily be simplified not to depend on hack/...
47RUN bash ./hack/make/.go-autogen
48RUN go build -o /dockerd \
49    -tags 'autogen apparmor seccomp selinux journald' \
50    -i \
51    -buildmode=pie \
52    -a -ldflags '-w'\
53    github.com/docker/docker/cmd/dockerd
54
55# docker-proxy
56# TODO if libnetwork folds into the docker tree this can be combined above
57FROM builder as proxy-builder
58RUN git clone https://github.com/docker/libnetwork.git /go/src/github.com/docker/libnetwork
59WORKDIR /go/src/github.com/docker/libnetwork
60RUN . /binaries-commits && \
61    git checkout -q "$LIBNETWORK_COMMIT" && \
62    go build -buildmode=pie -ldflags="-w" \
63        -o /docker-proxy \
64        github.com/docker/libnetwork/cmd/proxy
65
66# docker-init - TODO move this out, last time we bumped was 2016!
67FROM builder as init-builder
68RUN git clone https://github.com/krallin/tini.git /tini
69WORKDIR /tini
70RUN . /binaries-commits && \
71    git checkout -q "$TINI_COMMIT" && \
72    cmake . && make tini-static && \
73    cp tini-static /docker-init
74
75# Final docker image
76FROM scratch
77ARG VERSION
78ARG GITCOMMIT
79ARG BUILDTIME
80ARG PLATFORM
81ARG ENGINE_IMAGE
82COPY --from=dockerd-builder /dockerd /bin/
83COPY --from=proxy-builder /docker-proxy /bin/
84COPY --from=init-builder /docker-init /bin/
85
86LABEL \
87    org.opencontainers.image.authors="Docker Inc." \
88    org.opencontainers.image.created="${BUILDTIME}" \
89    org.opencontainers.image.documentation="https://docs.docker.com/" \
90    org.opencontainers.image.licenses="Apache-2.0" \
91    org.opencontainers.image.revision="${GITCOMMIT}" \
92    org.opencontainers.image.url="https://www.docker.com/products/docker-engine" \
93    org.opencontainers.image.vendor="Docker Inc." \
94    org.opencontainers.image.version="${VERSION}" \
95    com.docker.distribution_based_engine="{\"platform\":\"${PLATFORM}\",\"engine_image\":\"${ENGINE_IMAGE}\",\"containerd_min_version\":\"1.2.0-beta.1\",\"runtime\":\"host_install\"}"
96
97ENTRYPOINT ["/bin/dockerd"]
98