首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >docker build -无法打开TUN/TAP / dev /net/tun

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

Stack Overflow用户
提问于 2018-10-29 19:07:16
回答 1查看 11.5K关注 0票数 6

我将尝试构建带有openvpn连接到HideMyAss VPN的坞映像。查看Dockerfile:

代码语言:javascript
复制
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

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

代码语言:javascript
复制
cat: /dev/net/tun: File descriptor in bad state

但如果我去掉这两行:

代码语言:javascript
复制
cat /dev/net/tun

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

当我进入他(docker )并运行命令时,

代码语言:javascript
复制
openvpn --config /etc/openvpn/Belgium.Brussels.TCP.ovpn

那一切都很好。

有人能帮我吗,为什么它不能通过形象建设而起作用?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-10-29 21:41:33

首先,尝试嵌套Dockerfile指令,将层保持在最小(已知的最佳做法)。

例如,而不是这样:

代码语言:javascript
复制
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

照这样做

代码语言:javascript
复制
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

因此,您将只有一个运行指令,因此只有一个运行层的构建映像。

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

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

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

代码语言:javascript
复制
cat /dev/net/tun

请尝试这个Dockerfile:

代码语言:javascript
复制
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指令。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53052234

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档