docker内部版本-无法打开TUN/TAP/dev/net/TUN



我将尝试使用openvpn构建docker镜像,连接到HideMyAss VPN。查看Dockerfile:

FROM ubuntu:16.04
RUN apt-get update
RUN apt-get clean && apt-get -y update && apt-get install -y locales curl
RUN apt-get install -y php apache2 curl openvpn zip unzip bridge-utils
RUN apt-get install nano
RUN mkdir -p /dev/net && 
mknod /dev/net/tun c 10 200 && 
chmod 600 /dev/net/tun && 
cat /dev/net/tun
COPY tcp/Anguilla.TheValley.TCP.ovpn /etc/openvpn
COPY tcp/Angola.Luanda.TCP.ovpn /etc/openvpn
COPY tcp/Belgium.Brussels.TCP.ovpn /etc/openvpn
COPY tcp/pass.txt /etc/openvpn
EXPOSE 8888
RUN openvpn --config /etc/openvpn/Belgium.Brussels.TCP.ovpn

当我尝试构建这个代码时,我有一个错误:

cat: /dev/net/tun: File descriptor in bad state

但如果我删除这2行:

cat /dev/net/tun
RUN openvpn --config /etc/openvpn/Belgium.Brussels.TCP.ovpn

比容器成功构建,当我进入他(docker exec(并运行命令时

openvpn --config /etc/openvpn/Belgium.Brussels.TCP.ovpn

那么一切都很好。

有人能帮我吗,为什么它不能通过图像构建工作?

首先尝试嵌套Dockerfile指令,以将层保持在最低限度(其已知的最佳实践(

例如:

RUN apt-get update
RUN apt-get clean && apt-get -y update && apt-get install -y locales curl
RUN apt-get install -y php apache2 curl openvpn zip unzip bridge-utils
RUN apt-get install nano

这样做

RUN apt-get update && 
apt-get clean && apt-get -y update && apt-get install -y locales curl && 
apt-get install -y php apache2 curl openvpn zip unzip bridge-utils && 
apt-get install nano

因此,您将只有一个RUN指令,因此在构建图像中只有一个RUN层。

其次,当您想为运行容器添加默认执行时,请使用CMD而不是RUN。主要区别在于RUN在构建过程中用于执行构建映像所需的所有步骤,而CMD在容器启动后执行。默认docker入口点是/bin/bash -c,但没有默认命令。CMD指令将您放入的任何内容传递到该入口点。我为什么这么说?因为你想在容器启动后启动openvpn,而不是在构建过程中。

CMD的主要目的是为执行容器这些默认值可以包括可执行文件,也可以省略可执行文件,在这种情况下,必须指定ENTRYPOINT指令以及

也许是个愚蠢的问题,但你为什么需要这个部分?

cat /dev/net/tun

请尝试这个Dockerfile:

FROM ubuntu:16.04
RUN apt-get update && 
apt-get clean && apt-get -y update && apt-get install -y locales curl && 
apt-get install -y php apache2 curl openvpn zip unzip bridge-utils && 
apt-get install nano && 
mkdir -p /dev/net && 
mknod /dev/net/tun c 10 200 && 
chmod 600 /dev/net/tun
COPY tcp /etc/openvpn
EXPOSE 8888
CMD openvpn --config /etc/openvpn/Belgium.Brussels.TCP.ovpn

注意!每个Dockerfile只能有一条CMD指令。

最新更新