以下 BASH 脚本在 Docker 容器中下载并构建mpv(https://github.com/mpv-player/mpv-build),并使用 netcat 将文件发送到主机(主机正在使用 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 https://github.com/mpv-player/mpv-build.git; \
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
Run Code Online (Sandbox Code Playgroud)
所以脚本:
nc在主机上启动netcat( ),在后台监听连接nc连接到主机上的侦听套接字,并将生成的二进制文件发送回主机由于某种原因,在主机端收到时,结果文件的大小会减小。要么是 0 字节,要么是 1024 字节的倍数。开头似乎完好无损,是一个 x86_64 ELF 可执行文件。
这是一个数据包捕获,其中 docker 容器将一些 mpv 二进制文件发送到主机,但侦听nc(在主机上)过早关闭连接(它发送设置了 FIN 标志的数据包,在连接建立后几毫秒) ):

这里传输了 49152 个字节(它总是 1024 的倍数)。
并非总是存在 TCP 重传错误。我进行了另一个没有错误的捕获,但仍然只有一小部分被发送(24576)产生的 mpv 二进制文件是总共 21818582 个字节。
不确定这里发生了什么,为什么nc在打开连接后不久侦听/主机端会发送一个 FIN TCP 数据包?
使用该docker cp命令,可以像这样重写脚本:
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 https://github.com/mpv-player/mpv-build.git; \
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"
Run Code Online (Sandbox Code Playgroud)
netcat 现在仅用作一种消息传递机制,容器在完成构建后向主机发出信号(以便主机可以启动复制),并让主机向容器发出信号,表明它已完成复制文件(这样容器就可以退出)。
| 归档时间: |
|
| 查看次数: |
3361 次 |
| 最近记录: |