Envoi d'un fichier de conteneur Docker sur l'hôte avec nc: Pourquoi héberger nc Ferme la connexion trop tôt?

Le script de téléchargement et de montage suivant BASH

mpv

(
https://github.com/mpv-player/mpv-build
) Dans le conteneur Docker et envoie un fichier à héberger avec netcat (Hôte écoute avec netcat):

HOSTIP="192.168.1.100"
PORT="62514"

nc -v -l $PORT > mpv &

sleep 1

sudo docker run ubuntu:14.04 /bin/bash -c "\
sed -i -e 's/# deb/deb/g' /etc/apt/sources.list; \
cat /etc/apt/sources.list; \
apt-get update; \
apt-get install --yes --force-yes git python-minimal; \
git clone [url=https://github.com/mpv-player/mpv-build.git;]https://github.com/mpv-player/mpv-build.git;[/url] \
cd mpv-build/; \
./update; \
apt-get install --yes --force-yes devscripts equivs; \
rm -f mpv-build-deps_*_*.deb; \
mk-build-deps -i -t \"apt-get --yes --force-yes --no-install-recommends\"; \
./build -j\$(nproc); \
cat mpv/build/mpv | nc $HOSTIP $PORT; \
echo Done"

#close any nc process that might be left running
nc $HOSTIP $PORT

Donc, le script:

Lancement netcat (

nc

) Sur l'hôte écouter les composés en arrière-plan

Runs Conteneur Docker, dans lequel nous clonant le référentiel mpv, Bâtiment mpv, Utilisant

nc

Pour vous connecter à une prise d'écoute de l'hôte et envoyez le fichier binaire résultant à l'hôte

Pour une raison quelconque, le fichier résultant diminue de la quantité à la réception du côté de l'hôte. Soit ça 0 octets ou plusieurs 1024 octets. Le début semble intact, fichier exécutable x86_64 ELF.

Voici une capture d'emballage, où le conteneur Docker envoie une partie du fichier binaire. mpv sur l'hôte, mais où écoute

nc

(sur l'hôte) Ferme prématurément la connexion (Envoie un colis avec l'ensemble de drapeaux FIN, dans quelques millisecondes après avoir établi la connexion):


Ici a été transféré 49152 Octet (C'est toujours plus de peinture 1024).

Erreurs Transmission répétée TCP Il n'ya pas toujours de résultat. J'ai fait une autre saisie sans erreurs, mais il n'a toujours été envoyé qu'une petite partie (24576) Du commun 21818582 octets obtenus à la suite d'un fichier binaire mpv.

Je ne sais pas ce qui se passe ici, pourquoi

nc

Sur le côté d'écoute / Forfait d'envoi d'hôte FIN TCP Peu de temps après avoir ouvert la connexion?
Invité:

Emilie

Confirmation de:

Une autre solution - Utilisez simplement la redirection de flux, c'est-à-dire:

docker run /bin/sh -c '/my/build/command 1>&2 && cat /my/build/artifact' > artifact

Pour plusieurs fichiers ajoutez tar:

docker run /bin/sh -c '/my/build/command 1>&2 && tar -cf- -C /my/build/artifacts .' | tar -xf- -C artifacts

Alice

Confirmation de:

Utilisant

docker cp

Équipe, le script peut être réécrit pour:

HOSTIP="192.168.1.100"
PORT="62514"

set -e

CONTAINERID=$(sudo docker run -d ubuntu:14.04 /bin/bash -c "\
sed -i -e 's/# deb/deb/g' /etc/apt/sources.list; \
cat /etc/apt/sources.list; \
apt-get update; \
apt-get install --yes --force-yes git python-minimal; \
git clone [url=https://github.com/mpv-player/mpv-build.git;]https://github.com/mpv-player/mpv-build.git;[/url] \
cd mpv-build/; \
./update; \
apt-get install --yes --force-yes devscripts equivs; \
rm -f mpv-build-deps_*_*.deb; \
mk-build-deps -i -t \"apt-get --yes --force-yes --no-install-recommends\"; \
./build -j\$(nproc); \
echo \"From container: done building!\" | nc $HOSTIP $PORT; \
nc -v -l $PORT")

CONTAINERIP=$(sudo docker inspect $CONTAINERID|grep IPAddress|sed 's/.*IPAddress": "//'|sed 's/",$//')

echo "Started mpv-build container with Docker container ID: $CONTAINERID and IP: $CONTAINERIP"
echo "Waiting to hear from container that the build has finished..."

#listen on host. wait for container to connect and disconnect
nc -l $PORT

#copy file from running container, while it's listening for a connection with nc
sudo docker cp $CONTAINERID:/mpv-build/mpv/build/mpv ./

#connect to the listening socket in the container to make the container finish running
echo "bye" | nc $CONTAINERIP $PORT

echo "Done"

netcat Maintenant, il est utilisé uniquement comme une sorte de mécanisme de messagerie afin que le conteneur signale l'hôte lorsqu'il a terminé l'assemblage. (Afin que l'hôte puisse initier la copie), et pour l'hôte de signaler le conteneur qu'il a terminé de copier le fichier ( Faire le conteneur).

Dominique

Confirmation de:

Je n'ai pas de solution à des bizarreries spécifiques netcat, mais
https://docs.docker.com/engine ... e/cp/
pour ça.

Vous pouvez utiliser

docker cp <containerid>:/path/to/file /host/path/to/file

ne pas contacter netcat.
</containerid>

Pour répondre aux questions, connectez-vous ou registre