Прежде всего попробуйте вложить инструкции 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
инструкция.