diff --git a/Dockerfile b/Dockerfile index f93ed5c887..f88a5fb774 100644 --- a/Dockerfile +++ b/Dockerfile @@ -72,17 +72,6 @@ RUN set -x \ esac \ && rm -rf "$GOPATH" - - -FROM base AS docker-py -# Get the "docker-py" source so we can run their integration tests -ENV DOCKER_PY_COMMIT ac922192959870774ad8428344d9faa0555f7ba6 -RUN git clone https://github.com/docker/docker-py.git /build \ - && cd /build \ - && git checkout -q $DOCKER_PY_COMMIT - - - FROM base AS swagger # Install go-swagger for validating swagger.yaml ENV GO_SWAGGER_COMMIT c28258affb0b6251755d92489ef685af8d4ff3eb @@ -93,7 +82,6 @@ RUN set -x \ && go build -o /build/swagger github.com/go-swagger/go-swagger/cmd/swagger \ && rm -rf "$GOPATH" - FROM base AS frozen-images RUN apt-get update && apt-get install -y jq ca-certificates --no-install-recommends # Get useful and necessary Hub images so we can "docker load" locally instead of pulling @@ -227,25 +215,12 @@ RUN apt-get update && apt-get install -y \ jq \ libcap2-bin \ libdevmapper-dev \ -# libffi-dev and libssl-dev appear to be required for compiling paramiko on s390x/ppc64le - libffi-dev \ - libssl-dev \ libudev-dev \ libsystemd-dev \ binutils-mingw-w64 \ g++-mingw-w64-x86-64 \ net-tools \ pigz \ - python-backports.ssl-match-hostname \ - python-dev \ -# python-cffi appears to be required for compiling paramiko on s390x/ppc64le - python-cffi \ - python-mock \ - python-pip \ - python-requests \ - python-setuptools \ - python-websocket \ - python-wheel \ thin-provisioning-tools \ vim \ vim-common \ @@ -269,16 +244,6 @@ COPY --from=proxy /build/ /usr/local/bin/ COPY --from=dockercli /build/ /usr/local/cli COPY --from=registry /build/registry* /usr/local/bin/ COPY --from=criu /build/ /usr/local/ -COPY --from=docker-py /build/ /docker-py -# TODO: This is for the docker-py tests, which shouldn't really be needed for -# this image, but currently CI is expecting to run this image. This should be -# split out into a separate image, including all the `python-*` deps installed -# above. -RUN cd /docker-py \ - && pip install docker-pycreds==0.4.0 \ - && pip install paramiko==2.4.2 \ - && pip install yamllint==1.5.0 \ - && pip install -r test-requirements.txt COPY --from=rootlesskit /build/ /usr/local/bin/ COPY --from=djs55/vpnkit@sha256:e508a17cfacc8fd39261d5b4e397df2b953690da577e2c987a47630cd0c42f8e /vpnkit /usr/local/bin/vpnkit.x86_64 diff --git a/Makefile b/Makefile index f59ce72350..14b01c78f1 100644 --- a/Makefile +++ b/Makefile @@ -50,9 +50,11 @@ DOCKER_ENVS := \ -e DOCKER_PORT \ -e DOCKER_REMAP_ROOT \ -e DOCKER_STORAGE_OPTS \ + -e DOCKER_TEST_HOST \ -e DOCKER_USERLANDPROXY \ -e DOCKERD_ARGS \ -e TEST_INTEGRATION_DIR \ + -e TESTDEBUG \ -e TESTDIRS \ -e TESTFLAGS \ -e TIMEOUT \ diff --git a/hack/ci/janky b/hack/ci/janky index 458a74f7c1..ec48165896 100755 --- a/hack/ci/janky +++ b/hack/ci/janky @@ -8,7 +8,7 @@ hack/test/unit hack/make.sh \ binary-daemon \ dynbinary \ + test-docker-py \ test-integration-flaky \ test-integration \ - cross \ - test-docker-py + cross diff --git a/hack/make/test-docker-py b/hack/make/test-docker-py index b30879e3a0..2dc55a5454 100644 --- a/hack/make/test-docker-py +++ b/hack/make/test-docker-py @@ -3,18 +3,53 @@ set -e source hack/make/.integration-test-helpers -# subshell so that we can export PATH without breaking other things +# The commit or tag to use for testing +# TODO docker 17.06 cli client used in CI fails to build using a sha; +# unable to prepare context: unable to 'git clone' to temporary context directory: error fetching: error: no such remote ref ead0bb9e08c13dd3d1712759491eee06bf5a5602 +#: exit status 128 +: ${DOCKER_PY_COMMIT:=4.0.2} + +# custom options to pass py.test +# TODO remove these skip once we update to a docker-py version that has https://github.com/docker/docker-py/pull/2369 and https://github.com/docker/docker-py/pull/2380 +: ${PY_TEST_OPTIONS:="--deselect=tests/integration/api_swarm_test.py::SwarmTest::test_init_swarm_data_path_addr --deselect=tests/integration/api_exec_test.py::ExecTest::test_detach_with_arg --deselect=tests/integration/api_exec_test.py::ExecDemuxTest::test_exec_command_tty_stream_no_demux"} ( bundle .integration-daemon-start - dockerPy='/docker-py' - [ -d "$dockerPy" ] || { - dockerPy="$DEST/docker-py" - git clone https://github.com/docker/docker-py.git "$dockerPy" - } + docker_host_scheme=`echo "${DOCKER_HOST}" | cut -d: -f1 -` - # exporting PYTHONPATH to import "docker" from our local docker-py - test_env PYTHONPATH="$dockerPy" py.test --junitxml="$DEST/results.xml" "$dockerPy/tests/integration" + case "${docker_host_scheme}" in + unix) + # trim the tcp:// scheme, and bind-mount the docker socket into the container + run_opts="-v ${DOCKER_HOST#unix://}:/var/run/docker.sock" + ;; + tcp) + # run container in host-mode networking so that it can connect to the + # daemon from the current networking namespace (e.g., to connect to localhost) + run_opts="--network=host -e DOCKER_HOST=${DOCKER_HOST}" + ;; + + *) + echo "WARN: Skipping test-docker-py: connecting to docker daemon using ${docker_host_scheme} (${DOCKER_HOST}) not supported" + bundle .integration-daemon-stop + return 0 + esac + + docker_py_image="docker-sdk-python3:${DOCKER_PY_COMMIT}" + if ! docker image inspect "dockerPyImage" &> /dev/null; then + echo INFO: Building ${docker_py_image}... + ( + [ -n "${TESTDEBUG}" ] && set -x + [ -z "${TESTDEBUG}" ] && build_opts="--quiet" + [ -f /.dockerenv ] || build_opts="${build_opts} --network=host" + exec docker build ${build_opts} -t ${docker_py_image} -f tests/Dockerfile "https://github.com/docker/docker-py.git#${DOCKER_PY_COMMIT}" + ) + fi + + echo INFO: Starting docker-py tests... + ( + [ -n "${TESTDEBUG}" ] && set -x + exec docker run -t --rm ${run_opts} ${docker_py_image} pytest ${PY_TEST_OPTIONS} tests/integration + ) bundle .integration-daemon-stop ) 2>&1 | tee -a "$DEST/test.log"