b96093fa56
I have run into two separate issues while doing 'make all' on armhf (a Scaleway C1 machine, same as used in CI). This commit fixes both. 1. There were a lot of "not enough memory" errors, and after that in a few runs gometalinter just stuck forever on FUTEX_WAIT with no children left. Looking into docs, I found the --enable-gc option which solved the issue. [Update: this has already been added] 2. Timeout of 2 minutes is not enough for the abovementioned platform. The longest running linter is goimports which takes almost 6 minutes to run. Set the timeout to the observable run time roughly doubled. In addition, ARM platforms does not have too much RAM (2GB), so running too many processes in parallel might be problematic. Limit it by using -j2 [v2: make the timeout arch-dependent, also tested on aarch64 (2m15s)] [v3: moved timeout setting to Dockerfiles] [v4: generalized to GOMETALINTER_OPTS, added -j2 for ARM platforms] [v5: rebase to master] Signed-off-by: Kir Kolyshkin <kolyshkin@gmail.com>
221 lines
8.2 KiB
Docker
221 lines
8.2 KiB
Docker
# This file describes the standard way to build Docker, using docker
|
|
#
|
|
# Usage:
|
|
#
|
|
# # Assemble the full dev environment. This is slow the first time.
|
|
# docker build -t docker .
|
|
#
|
|
# # Mount your source in an interactive container for quick testing:
|
|
# docker run -v `pwd`:/go/src/github.com/docker/docker --privileged -i -t docker bash
|
|
#
|
|
# # Run the test suite:
|
|
# docker run -e DOCKER_GITCOMMIT=foo --privileged docker hack/make.sh test-unit test-integration test-docker-py
|
|
#
|
|
# # Publish a release:
|
|
# docker run --privileged \
|
|
# -e AWS_S3_BUCKET=baz \
|
|
# -e AWS_ACCESS_KEY=foo \
|
|
# -e AWS_SECRET_KEY=bar \
|
|
# -e GPG_PASSPHRASE=gloubiboulga \
|
|
# docker hack/release.sh
|
|
#
|
|
# Note: AppArmor used to mess with privileged mode, but this is no longer
|
|
# the case. Therefore, you don't have to disable it anymore.
|
|
#
|
|
|
|
FROM debian:jessie
|
|
|
|
# allow replacing httpredir or deb mirror
|
|
ARG APT_MIRROR=deb.debian.org
|
|
RUN sed -ri "s/(httpredir|deb).debian.org/$APT_MIRROR/g" /etc/apt/sources.list
|
|
|
|
# Packaged dependencies
|
|
RUN apt-get update && apt-get install -y \
|
|
apparmor \
|
|
apt-utils \
|
|
aufs-tools \
|
|
automake \
|
|
bash-completion \
|
|
binutils-mingw-w64 \
|
|
bsdmainutils \
|
|
btrfs-tools \
|
|
build-essential \
|
|
cmake \
|
|
createrepo \
|
|
curl \
|
|
dpkg-sig \
|
|
gcc-mingw-w64 \
|
|
git \
|
|
iptables \
|
|
jq \
|
|
less \
|
|
libapparmor-dev \
|
|
libcap-dev \
|
|
libnl-3-dev \
|
|
libprotobuf-c0-dev \
|
|
libprotobuf-dev \
|
|
libsystemd-journal-dev \
|
|
libtool \
|
|
mercurial \
|
|
net-tools \
|
|
pkg-config \
|
|
protobuf-compiler \
|
|
protobuf-c-compiler \
|
|
python-dev \
|
|
python-mock \
|
|
python-pip \
|
|
python-websocket \
|
|
tar \
|
|
vim \
|
|
vim-common \
|
|
xfsprogs \
|
|
zip \
|
|
--no-install-recommends \
|
|
&& pip install awscli==1.10.15
|
|
|
|
# Get lvm2 sources to build statically linked devmapper library
|
|
ENV LVM2_VERSION 2.02.173
|
|
RUN mkdir -p /usr/local/lvm2 \
|
|
&& curl -fsSL "https://mirrors.kernel.org/sourceware/lvm2/LVM2.${LVM2_VERSION}.tgz" \
|
|
| tar -xzC /usr/local/lvm2 --strip-components=1
|
|
|
|
# Compile and install (only the needed library)
|
|
RUN cd /usr/local/lvm2 \
|
|
&& ./configure \
|
|
--build="$(gcc -print-multiarch)" \
|
|
--enable-static_link \
|
|
--enable-pkgconfig \
|
|
&& make -C include \
|
|
&& make -C libdm install_device-mapper
|
|
|
|
# Install seccomp: the version shipped upstream is too old
|
|
ENV SECCOMP_VERSION 2.3.2
|
|
RUN set -x \
|
|
&& export SECCOMP_PATH="$(mktemp -d)" \
|
|
&& curl -fsSL "https://github.com/seccomp/libseccomp/releases/download/v${SECCOMP_VERSION}/libseccomp-${SECCOMP_VERSION}.tar.gz" \
|
|
| tar -xzC "$SECCOMP_PATH" --strip-components=1 \
|
|
&& ( \
|
|
cd "$SECCOMP_PATH" \
|
|
&& ./configure --prefix=/usr/local \
|
|
&& make \
|
|
&& make install \
|
|
&& ldconfig \
|
|
) \
|
|
&& rm -rf "$SECCOMP_PATH"
|
|
|
|
# Install Go
|
|
# IMPORTANT: If the version of Go is updated, the Windows to Linux CI machines
|
|
# will need updating, to avoid errors. Ping #docker-maintainers on IRC
|
|
# with a heads-up.
|
|
# IMPORTANT: When updating this please note that stdlib archive/tar pkg is vendored
|
|
ENV GO_VERSION 1.8.3
|
|
RUN curl -fsSL "https://golang.org/dl/go${GO_VERSION}.linux-amd64.tar.gz" \
|
|
| tar -xzC /usr/local
|
|
|
|
ENV PATH /go/bin:/usr/local/go/bin:$PATH
|
|
ENV GOPATH /go
|
|
|
|
# Install CRIU for checkpoint/restore support
|
|
ENV CRIU_VERSION 2.12.1
|
|
# Install dependancy packages specific to criu
|
|
RUN apt-get install libnet-dev -y && \
|
|
mkdir -p /usr/src/criu \
|
|
&& curl -sSL https://github.com/xemul/criu/archive/v${CRIU_VERSION}.tar.gz | tar -v -C /usr/src/criu/ -xz --strip-components=1 \
|
|
&& cd /usr/src/criu \
|
|
&& make \
|
|
&& make install-criu
|
|
|
|
# Install two versions of the registry. The first is an older version that
|
|
# only supports schema1 manifests. The second is a newer version that supports
|
|
# both. This allows integration-cli tests to cover push/pull with both schema1
|
|
# and schema2 manifests.
|
|
ENV REGISTRY_COMMIT_SCHEMA1 ec87e9b6971d831f0eff752ddb54fb64693e51cd
|
|
ENV REGISTRY_COMMIT 47a064d4195a9b56133891bbb13620c3ac83a827
|
|
RUN set -x \
|
|
&& export GOPATH="$(mktemp -d)" \
|
|
&& git clone https://github.com/docker/distribution.git "$GOPATH/src/github.com/docker/distribution" \
|
|
&& (cd "$GOPATH/src/github.com/docker/distribution" && git checkout -q "$REGISTRY_COMMIT") \
|
|
&& GOPATH="$GOPATH/src/github.com/docker/distribution/Godeps/_workspace:$GOPATH" \
|
|
go build -o /usr/local/bin/registry-v2 github.com/docker/distribution/cmd/registry \
|
|
&& (cd "$GOPATH/src/github.com/docker/distribution" && git checkout -q "$REGISTRY_COMMIT_SCHEMA1") \
|
|
&& GOPATH="$GOPATH/src/github.com/docker/distribution/Godeps/_workspace:$GOPATH" \
|
|
go build -o /usr/local/bin/registry-v2-schema1 github.com/docker/distribution/cmd/registry \
|
|
&& rm -rf "$GOPATH"
|
|
|
|
# Install notary and notary-server
|
|
ENV NOTARY_VERSION v0.5.0
|
|
RUN set -x \
|
|
&& export GOPATH="$(mktemp -d)" \
|
|
&& git clone https://github.com/docker/notary.git "$GOPATH/src/github.com/docker/notary" \
|
|
&& (cd "$GOPATH/src/github.com/docker/notary" && git checkout -q "$NOTARY_VERSION") \
|
|
&& GOPATH="$GOPATH/src/github.com/docker/notary/vendor:$GOPATH" \
|
|
go build -o /usr/local/bin/notary-server github.com/docker/notary/cmd/notary-server \
|
|
&& GOPATH="$GOPATH/src/github.com/docker/notary/vendor:$GOPATH" \
|
|
go build -o /usr/local/bin/notary github.com/docker/notary/cmd/notary \
|
|
&& rm -rf "$GOPATH"
|
|
|
|
# Get the "docker-py" source so we can run their integration tests
|
|
ENV DOCKER_PY_COMMIT a962578e515185cf06506050b2200c0b81aa84ef
|
|
# To run integration tests docker-pycreds is required.
|
|
# Before running the integration tests conftest.py is
|
|
# loaded which results in loads auth.py that
|
|
# imports the docker-pycreds module.
|
|
RUN git clone https://github.com/docker/docker-py.git /docker-py \
|
|
&& cd /docker-py \
|
|
&& git checkout -q $DOCKER_PY_COMMIT \
|
|
&& pip install docker-pycreds==0.2.1 \
|
|
&& pip install -r test-requirements.txt
|
|
|
|
# Install yamllint for validating swagger.yaml
|
|
RUN pip install yamllint==1.5.0
|
|
|
|
# Install go-swagger for validating swagger.yaml
|
|
ENV GO_SWAGGER_COMMIT c28258affb0b6251755d92489ef685af8d4ff3eb
|
|
RUN git clone https://github.com/go-swagger/go-swagger.git /go/src/github.com/go-swagger/go-swagger \
|
|
&& (cd /go/src/github.com/go-swagger/go-swagger && git checkout -q $GO_SWAGGER_COMMIT) \
|
|
&& go install -v github.com/go-swagger/go-swagger/cmd/swagger
|
|
|
|
# Set user.email so crosbymichael's in-container merge commits go smoothly
|
|
RUN git config --global user.email 'docker-dummy@example.com'
|
|
|
|
# Add an unprivileged user to be used for tests which need it
|
|
RUN groupadd -r docker
|
|
RUN useradd --create-home --gid docker unprivilegeduser
|
|
|
|
VOLUME /var/lib/docker
|
|
WORKDIR /go/src/github.com/docker/docker
|
|
ENV DOCKER_BUILDTAGS apparmor seccomp selinux
|
|
|
|
# Let us use a .bashrc file
|
|
RUN ln -sfv $PWD/.bashrc ~/.bashrc
|
|
# Add integration helps to bashrc
|
|
RUN echo "source $PWD/hack/make/.integration-test-helpers" >> /etc/bash.bashrc
|
|
|
|
# Get useful and necessary Hub images so we can "docker load" locally instead of pulling
|
|
COPY contrib/download-frozen-image-v2.sh /go/src/github.com/docker/docker/contrib/
|
|
RUN ./contrib/download-frozen-image-v2.sh /docker-frozen-images \
|
|
buildpack-deps:jessie@sha256:85b379ec16065e4fe4127eb1c5fb1bcc03c559bd36dbb2e22ff496de55925fa6 \
|
|
busybox:latest@sha256:32f093055929dbc23dec4d03e09dfe971f5973a9ca5cf059cbfb644c206aa83f \
|
|
debian:jessie@sha256:72f784399fd2719b4cb4e16ef8e369a39dc67f53d978cd3e2e7bf4e502c7b793 \
|
|
hello-world:latest@sha256:c5515758d4c5e1e838e9cd307f6c6a0d620b5e07e6f927b07d05f6d12a1ac8d7
|
|
# See also ensureFrozenImagesLinux() in "integration-cli/fixtures_linux_daemon_test.go" (which needs to be updated when adding images to this list)
|
|
|
|
# Install tomlv, vndr, runc, containerd, tini, docker-proxy dockercli
|
|
# Please edit hack/dockerfile/install-binaries.sh to update them.
|
|
COPY hack/dockerfile/binaries-commits /tmp/binaries-commits
|
|
COPY hack/dockerfile/install-binaries.sh /tmp/install-binaries.sh
|
|
RUN /tmp/install-binaries.sh tomlv vndr runc containerd tini proxy dockercli gometalinter
|
|
ENV PATH=/usr/local/cli:$PATH
|
|
|
|
# Activate bash completion and include Docker's completion if mounted with DOCKER_BASH_COMPLETION_PATH
|
|
RUN echo "source /usr/share/bash-completion/bash_completion" >> /etc/bash.bashrc
|
|
RUN ln -s /usr/local/completion/bash/docker /etc/bash_completion.d/docker
|
|
|
|
# Wrap all commands in the "docker-in-docker" script to allow nested containers
|
|
ENTRYPOINT ["hack/dind"]
|
|
|
|
# Upload docker source
|
|
COPY . /go/src/github.com/docker/docker
|
|
|
|
# Options for hack/validate/gometalinter
|
|
ENV GOMETALINTER_OPTS="--deadline 2m"
|