докер-контейнер

Запускать команды внутри Docker-контейнера проще, чем вы думаете.

Docker-контейнер — это изолированная среда, которая обычно содержит одно приложение со всеми необходимыми зависимостями. Часто нам нужно запустить некоторые команды внутри Docker-контейнера. Есть несколько способов выполнить команду внутри контейнера и получить требуемый результат.

Давайте посмотрим, как мы можем это сделать.

Использование интерактивной оболочки

Мы можем напрямую получить доступ к оболочке контейнера и выполнять наши команды, как с обычным терминалом Linux. Чтобы получить интерактивную оболочку остановленного (не работающего) контейнера, вы можете использовать:

$ docker run -it ubuntu bash root@c520631f652d:/#

Как видите, мы попали прямо в новый контейнер Ubuntu, где мы можем запускать наши команды. Если контейнер уже запущен, вы можете использовать команду exec, как показано ниже.

Для начала давайте узнаем идентификатор контейнера.

$ docker ps ИДЕНТИФИКАТОР КОНТЕЙНЕРА ИЗОБРАЖЕНИЕ КОМАНДА СОЗДАНО СТАТУС ИМЕНА ПОРТОВ c2d969adde7a nginx «/docker-entrypoint.…» 2 часа назад Up 2 часа 127.0.0.1:80->80/tcp nginx 0960560bc24b mariadb «docker-entrypoint.s…» 2 часа назад Up 2 часа 127.0.0.1:3306->3306/tcp mariadb

И затем войдите в идентификатор контейнера c2d969adde7a.

$ docker exec -it c2d969adde7a bash root@c2d969adde7a:/#

В приведенном выше выводе вы можете заметить, что мы запустили сеанс bash контейнера nginx, который находился в рабочем состоянии. Здесь мы можем выполнить любую поддерживаемую команду и получить результат.

Примечание. В вашем контейнере может отсутствовать bash, и если да, вы можете использовать sh.

Бывший:

Docker Exec -it c2d969adde7a ш

Прямой выход

Часто нам просто нужен вывод одной или двух команд, и для нашей задачи не требуется полноценный интерактивный сеанс. Вы можете запустить необходимую команду внутри контейнера и получить ее выходные данные напрямую, не открывая новый сеанс оболочки, используя команду exec без флага -it. Его синтаксис будет:

$ docker exec <идентификатор или имя контейнера> <команда>

Вот пример:

$ docker ps ИДЕНТИФИКАТОР КОНТЕЙНЕРА ИЗОБРАЖЕНИЕ КОМАНДА СОЗДАНО СТАТУС ИМЕНА ПОРТОВ c2d969adde7a nginx «/docker-entrypoint.…» 2 часа назад Up 2 часа 127.0.0.1:80->80/tcp nginx 0960560bc24b mariadb «docker-entrypoint.s…» 2 часа назад Up 2 часа 127.0.0.1:3306->3306/tcp mariadb $ docker exec 0960560bc24b ps -ef | grep mysql mysql 1 0 0 13:35 ? 00:00:02 mysqld $

Мы выполнили ps -ef | grep mysql внутри работающего контейнера MariaDB и напрямую получил выходные данные.

Путь Dockerfile

Это не совсем тот способ запуска команд внутри Docker-контейнера, хотя он может быть полезен в ситуациях разработки или для первоначальной отладки развертывания и т. д. Мы можем использовать команду RUN внутри Dockerfile. Вот наш образец Dockerfile:

ОТ nginx: последний ЗАПУСК nginx -V

Он просто извлекает последний образ nginx из реестра, а затем запускает команду nginx -V, чтобы отобразить версию Nginx при создании образа.

$ docker build -t nginx-test. Отправка контекста сборки демону Docker 2.048kB Шаг 1/2: FROM nginx:latest —> 7ce4f91ef623 Шаг 2/2: RUN nginx -V —> Запуск в версии 43918bbbeaa5 nginx: nginx/1.19.9, созданный gcc 8.3 .0 (Debian 8.3.0-6), созданный с использованием OpenSSL 1.1.1d 10 сентября 2019 г. Включена поддержка TLS SNI. Настройте аргументы: —prefix=/etc/nginx —sbin-path=/usr/sbin/nginx —modules- path=/usr/lib/nginx/modules —conf-path=/etc/nginx/nginx.conf —error-log-path=/var/log/nginx/error.log —http-log-path= /var/log/nginx/access.log —pid-path=/var/run/nginx.pid —lock-path=/var/run/nginx.lock —http-client-body-temp-path= /var/cache/nginx/client_temp —http-proxy-temp-path=/var/cache/nginx/proxy_temp —http-fastcgi-temp-path=/var/cache/nginx/fastcgi_temp —http-uwsgi- temp-path=/var/cache/nginx/uwsgi_temp —http-scgi-temp-path=/var/cache/nginx/scgi_temp —user=nginx —group=nginx —with-compat —with-file -aio —with-threads —with-http_addition_module —with-http_auth_request_module —with-http_dav_module —with-http_flv_module —with-http_gunzip_module —with-http_gzip_static_module —with-http_mp4_module —with-http_random_index_module —with -http_realip_module —with-http_secure_link_module —with-http_slice_module —with-http_ssl_module —with-http_stub_status_module —with-http_sub_module —with-http_v2_module —with-mail —with-mail_ssl_module —with-stream —with -stream_realip_module —with-stream_ssl_module —with-stream_ssl_preread_module —with-cc-opt='-g -O2 -fdebug-prefix-map=/data/builder/debuild/nginx-1.19.9/debian/debuild-base /nginx-1.19.9=. -fstack-protector-strong -Wformat -Werror=format-security -Wp,-D_FORTIFY_SOURCE=2 -fPIC' —with-ld-opt='-Wl,-z,relro -Wl,-z,now -Wl, —as-needed -pie' Удаление промежуточного контейнера 43918bbbeaa5 —> d682277f2e50 Успешно построено d682277f2e50 Успешно помечено nginx-test:latest $

Обратите внимание на вывод команды RUN в приведенном выше фрагменте. Приведенный выше фрагмент будет отображаться только в первой сборке, а последующие сборки не будут повторять вывод команды RUN. В качестве обходного пути вы можете попробовать флаг —no-cache:

$ docker build -t nginx-test. —no-кэш

Последний метод — не лучший способ, но иногда может быть полезен при отладке и т. д.

Краткое содержание

Запустить команду внутри Docker-контейнера просто, и для этого существует несколько способов. Это обычная задача администратора Docker, поэтому знание этих команд полезно.

Источник