Сборка докера - Невозможно открыть TUN / TAP dev / dev / net / tun - PullRequest
0 голосов
/ 29 октября 2018

Я попробую собрать образ докера с openvpn connect to 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

тогда все отлично работает.

Может ли кто-нибудь помочь мне, почему это не работает через создание изображений?

1 Ответ

0 голосов
/ 30 октября 2018

Прежде всего попробуйте вложить инструкции 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 выполняется после запуска контейнера. Точка входа в докер по умолчанию /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 инструкция.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...