Use process substitution to redirect to tee
**- What I did**

In some cases, when the daemon launched by a test panics and quits, the cleanup code would end with an error when trying to kill it by its pid. In those cases the whole suite will end up waiting for the daemon that we start in .integration-daemon-start to finish and we end up waiting 2 hours for the CI to cancel after a timeout.

Using process substitution makes the integration tests quit.

**- How I did it**

**- How to verify it**

Run 

```console
$ make DOCKER_GRAPHDRIVER=overlayfs TEST_FILTER=TestRunWithRuntimeFromConfigFile TEST_INTEGRATION_USE_SNAPSHOTTER=1 test-integration
```

Before this change this will never stop and hang after the `/go/src/github.com/docker/docker/hack/make/.integration-daemon-stop: line 11: kill: (1269) - No such process` error.

After this change the script will stop after the kill error in the cleanup code.

**- Description for the changelog**
<!--
Write a short (one line) summary that describes the changes in this
pull request for inclusion in the changelog:
-->


**- A picture of a cute animal (not mandatory but encouraged)**


hack/make/test-docker-py
#!/usr/bin/env bash
set -e

source hack/make/.integration-test-helpers

# The commit or tag to use for testing
: "${DOCKER_PY_COMMIT:=6.1.3}"

# The version (and variant) of the python image to use for the tests;
# see https://github.com/docker/docker-py/blob/5.0.3/tests/Dockerfile#L1C5-L3
#
# TODO remove once https://github.com/docker/docker-py/pull/3145 is merged.
: "${PYTHON_VERSION:=3.7-bullseye}"

# custom options to pass py.test
#
# This option can be used to temporarily skip flaky tests (using the `--deselect`
# flag) until they are fixed upstream. For example:
# --deselect=tests/integration/api_container_test.py::AttachContainerTest::test_attach_no_stream
# TODO re-enable test_attach_no_stream after https://github.com/docker/docker-py/issues/2513 is resolved
# TODO re-enable test_run_container_reading_socket_ws. It's reported in https://github.com/docker/docker-py/issues/1478, and we're getting that error in our tests.
# TODO re-enable test_create_with_restart_policy after https://github.com/docker/docker-py/pull/3165 is included in a release
# TODO re-enable test_api_error_parses_json after https://github.com/docker/docker-py/pull/3165 is included in a release
# TODO re-enable test_connect_with_ipv6_address after we updated to a version of docker-py with https://github.com/docker/docker-py/pull/3169
# TODO re-enable test_create_network_ipv6_enabled after we updated to a version of docker-py with https://github.com/docker/docker-py/pull/3169
# TODO re-enable test_create_with_ipv6_address after we updated to a version of docker-py with https://github.com/docker/docker-py/pull/3169
: "${PY_TEST_OPTIONS:=--junitxml=${DEST}/junit-report.xml --deselect=tests/integration/api_container_test.py::AttachContainerTest::test_attach_no_stream --deselect=tests/integration/api_container_test.py::AttachContainerTest::test_run_container_reading_socket_ws --deselect=tests/integration/api_container_test.py::CreateContainerTest::test_create_with_restart_policy --deselect=tests/integration/errors_test.py::ErrorsTest::test_api_error_parses_json --deselect=tests/integration/api_network_test.py::TestNetworks::test_connect_with_ipv6_address --deselect=tests/integration/api_network_test.py::TestNetworks::test_create_network_ipv6_enabled --deselect=tests/integration/api_network_test.py::TestNetworks::test_create_with_ipv6_address}"
(
	bundle .integration-daemon-start

	docker_host_scheme=$(echo "${DOCKER_HOST}" | cut -d: -f1 -)

	case "${docker_host_scheme}" in
		unix)
			# trim the tcp:// scheme, and bind-mount the docker socket into the container
			run_opts="--mount type=bind,src=${DOCKER_HOST#unix://},dst=/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"
			# shellcheck disable=SC2086
			exec docker build ${build_opts} --build-arg PYTHON_VERSION="${PYTHON_VERSION}" -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
		# shellcheck disable=SC2086,SC2140
		exec docker run --rm ${run_opts} --mount type=bind,"src=${ABS_DEST}","dst=/src/${DEST}" "${docker_py_image}" pytest ${PY_TEST_OPTIONS} tests/integration
	)
	bundle .integration-daemon-stop
) 2>&1 | tee -a "$DEST/test.log"

#!/usr/bin/env bash
set -e

source hack/make/.integration-test-helpers

# The commit or tag to use for testing
: "${DOCKER_PY_COMMIT:=6.1.3}"

# The version (and variant) of the python image to use for the tests;
# see https://github.com/docker/docker-py/blob/5.0.3/tests/Dockerfile#L1C5-L3
#
# TODO remove once https://github.com/docker/docker-py/pull/3145 is merged.
: "${PYTHON_VERSION:=3.7-bullseye}"

# custom options to pass py.test
#
# This option can be used to temporarily skip flaky tests (using the `--deselect`
# flag) until they are fixed upstream. For example:
# --deselect=tests/integration/api_container_test.py::AttachContainerTest::test_attach_no_stream
# TODO re-enable test_attach_no_stream after https://github.com/docker/docker-py/issues/2513 is resolved
# TODO re-enable test_run_container_reading_socket_ws. It's reported in https://github.com/docker/docker-py/issues/1478, and we're getting that error in our tests.
# TODO re-enable test_create_with_restart_policy after https://github.com/docker/docker-py/pull/3165 is included in a release
# TODO re-enable test_api_error_parses_json after https://github.com/docker/docker-py/pull/3165 is included in a release
# TODO re-enable test_connect_with_ipv6_address after we updated to a version of docker-py with https://github.com/docker/docker-py/pull/3169
# TODO re-enable test_create_network_ipv6_enabled after we updated to a version of docker-py with https://github.com/docker/docker-py/pull/3169
# TODO re-enable test_create_with_ipv6_address after we updated to a version of docker-py with https://github.com/docker/docker-py/pull/3169
: "${PY_TEST_OPTIONS:=--junitxml=${DEST}/junit-report.xml --deselect=tests/integration/api_container_test.py::AttachContainerTest::test_attach_no_stream --deselect=tests/integration/api_container_test.py::AttachContainerTest::test_run_container_reading_socket_ws --deselect=tests/integration/api_container_test.py::CreateContainerTest::test_create_with_restart_policy --deselect=tests/integration/errors_test.py::ErrorsTest::test_api_error_parses_json --deselect=tests/integration/api_network_test.py::TestNetworks::test_connect_with_ipv6_address --deselect=tests/integration/api_network_test.py::TestNetworks::test_create_network_ipv6_enabled --deselect=tests/integration/api_network_test.py::TestNetworks::test_create_with_ipv6_address}"
(
	bundle .integration-daemon-start

	docker_host_scheme=$(echo "${DOCKER_HOST}" | cut -d: -f1 -)

	case "${docker_host_scheme}" in
		unix)
			# trim the tcp:// scheme, and bind-mount the docker socket into the container
			run_opts="--mount type=bind,src=${DOCKER_HOST#unix://},dst=/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"
			# shellcheck disable=SC2086
			exec docker build ${build_opts} --build-arg PYTHON_VERSION="${PYTHON_VERSION}" -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
		# shellcheck disable=SC2086,SC2140
		exec docker run --rm ${run_opts} --mount type=bind,"src=${ABS_DEST}","dst=/src/${DEST}" "${docker_py_image}" pytest ${PY_TEST_OPTIONS} tests/integration
	)
	bundle .integration-daemon-stop
) &> >(tee -a "$DEST/test.log")

no `&>`?  Are the changes in these two file different because we don't want to redirect stderr here?