docker build - 无法打开 TUN/TAP dev /dev/net/tun

Ser*_*i R 6 ubuntu docker

我将尝试使用 openvpn 连接到 HideMyAss VPN 来构建 docker 映像。查看 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
Run Code Online (Sandbox Code Playgroud)

当我尝试构建此代码时,出现错误:

cat: /dev/net/tun: File descriptor in bad state
Run Code Online (Sandbox Code Playgroud)

但如果我删除这 2 行:

cat /dev/net/tun

RUN openvpn --config /etc/openvpn/Belgium.Brussels.TCP.ovpn
Run Code Online (Sandbox Code Playgroud)

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

openvpn --config /etc/openvpn/Belgium.Brussels.TCP.ovpn
Run Code Online (Sandbox Code Playgroud)

然后一切正常。

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

Rao*_*zur 8

首先尝试嵌套 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 Code Online (Sandbox Code Playgroud)

这样做

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 Code Online (Sandbox Code Playgroud)

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

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

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

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

cat /dev/net/tun
Run Code Online (Sandbox Code Playgroud)

请尝试这个 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
Run Code Online (Sandbox Code Playgroud)

!笔记!每个 Dockerfile只能有一条CMD指令。