Первая ошибка - думать, что образ/контейнер Docker похож на виртуальную машину. Сходства есть, но они не одинаковы и, честно говоря, не очень похожи.
На самом деле Docker не предназначен для запуска операционной системы. Он предназначен для запуска одного процесса в замкнутой (изолированной) среде. Контейнер использует то же ядро, что и на хосте.
Когда вы создаете образ Docker с помощью FROM ubuntu
вы начинаете свой образ с нескольких предварительно созданных слоев, которые содержат некоторые части стандартной файловой системы и пакетов, которые вы могли бы найти на сервере Ubuntu.
Затем вы добавляете свои собственные дополнительные слои, добавляя двоичные файлы и файлы, необходимые для запуска вашей программы / процесса.
Изображение будет (обычно, но не обязательно) иметь CMD
команда или ENTRYPOINT
команда для запуска чего-либо.
Каждая строка в Dockerfile
это команда, инструктирующая Docker о том, как создать образ. Каждая строка/команда приводит к появлению еще одного слоя. Чтобы установить пакеты, вы, вероятно, захотите сделать что-то вроде этого:
FROM ubuntu:16.04RUN apt-get -qq update && \ apt-get -y install build-essential autoconf libtool && \ apt-get install -y python-setuptools python-dev python3-dev && \ apt-get install -y python-pip python3-pip && \ apt-get install -y python-virtualenv unixodbc-dev libffi-dev git && \ apt-get clean && \ rm -rf /var/lib/apt/lists/*
Это уменьшит размер вашего изображения.
Тогда вам нужно будет действительно что-то запустить...
CMD python
Тогда вы сможете создать свой образ:
docker build -t myimage .
И используй это...
docker run --rm -it myimage
ifconfig
не работает, потому что двоичный файл отсутствует в изображении. На самом деле в этом нет необходимости, поскольку вы не управляете сетью изнутри контейнера.
Итак, вы, похоже, создаете контейнер для создания некоторого кода. Вы хотели бы смонтировать свой каталог с кодом внутри контейнера, когда вы его запустите. Я не знаю, какую ОС вы используете на своей рабочей станции или сервере, поэтому я обращусь к этому сообщению для получения дополнительной информации: https://stackoverflow.com/questions/41485217/mount-current-directory-as-a-volume-in-docker-on-windows-10/41489151#41489151
Допустим, вы строите с помощью команды make
, ты мог бы сделать это:
docker run --rm -it -v $(pwd):/usr/src/project myimage make
Для этого потребуется строка в вашем Dockerfile
чтобы сделать рабочий реж /usr/src/project
:
WORKDIR /usr/src/project
Что произойдет, если вы запустите docker
приведенная выше командная строка заключается в том, что она создаст контейнер из изображения с именем myimage
(команда сборки, показанная ранее), смонтируйте текущий каталог, в котором вы находитесь, как /usr/src/project
внутри нового контейнера. Запустите программу make
команда внутри контейнера, а затем выход. То --rm
параметр сообщает Docker, чтобы он не оставлял контейнер рядом, как только он завершит работу. То -it
параметры означают interactive
и tty
.
Если вы хотите просто иметь доступ к какой-либо оболочке, чтобы вы могли вручную запустить make
или другие команды специальным образом, вы также можете сделать это:
docker run --rm -it -v $(pwd):/usr/src/project myimage /bin/bash
Это создало бы контейнер из myimage
изображение и запустите bash
. Потому что bash
не завершается, и у вас есть -it
параметр, вы окажетесь в подсказке контейнера, где вы можете делать все, что захотите.
Просто помните, что любой файл, который вы изменяете внутри контейнера, не будет сохранен, и в следующий раз вы вернетесь к состоянию по умолчанию. Конечно, любые файлы из /usr/src/project
каталог будет изменен на вашем локальном жестком диске, поскольку он монтируется с него.