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

时间:2018-10-29 19:07:17

标签: docker ubuntu

我将尝试使用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

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

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

然后一切正常。

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

1 个答案:

答案 0 :(得分:0)

首先,尝试嵌套Dockerfile指令以使层数最少(已知的best practice

例如,代替此:

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指令。