У меня есть два образа Docker, один из которых содержит pandoc
(утилита для преобразования документов из разных форматов во многие форматы), а другой содержащий pdflatex
(из texlive
, чтобы преобразовать tex
файлов в pdf
). Моя цель здесь - преобразовать документы из md
в pdf
.
Я могу запустить каждое изображение отдельно:
# call pandoc inside my-pandoc-image (md -> tex)
docker run --rm \
-v $(pwd):/pandoc \
my-pandoc-image \
pandoc -s test.md -o test.tex
# call pdflatex inside my-texlive-image (tex -> pdf)
docker run --rm \
-v $(pwd):/texlive \
my-texlive-image \
pdflatex test.tex # generates test.pdf
Но на самом деле я хочу вызвать pandoc
(из его контейнера) напрямую, чтобы преобразовать md
в pdf
, например:
docker run --rm \
-v $(pwd):/pandoc \
my-pandoc-image \
pandoc -s test.md --latex-engine pdflatex -o test.pdf
Эта команда не работает здесь, потому что pandoc
внутри контейнера пытается вызвать pdflatex
(который должен быть в $PATH
) для создания pdf, но pdflatex
не существует, так как он не установлен в my-pandoc-image
.
В моем случае pdflatex
устанавливается в образ my-texlive-image
.
Итак, из этого примера у меня возникает вопрос: может ли контейнер A вызывать исполняемый файл, расположенный в другом контейнере B?
Я почти уверен, что это возможно, потому что если я установлю pandoc
на своем хосте (без pdflatex
), я смогу запустить pandoc -s test.md--latex-engine=pdflatex -o test.pdf
, просто назвав команду pdflatex
псевдонимом:
pdflatex() {
docker run --rm \
-v $(pwd):/texlive \
my-texlive-image \
pdflatex "$@"
}
Таким образом, когда pdflatex
вызывается pandoc
, контейнер запускается и выполняет преобразование.
Но при использовании двух контейнеров, как я могу использовать псевдоним команды pdflatex
, чтобы имитировать ее существование в контейнере, имеющем только pandoc
?
Я взглянул на docker-compose
, так как я уже использовал его для связи двух контейнеров (приложение взаимодействует с базой данных). Я даже думал о ssh
переходе из контейнера A в контейнер B для вызова команды pdflatex
, но это окончательно не правильное решение.
Наконец, я также создал образ, содержащий pandoc
+ pdflatex
(это сработало, потому что два исполняемых файла находились в одном образе), но я действительно хочу сохранить 2 образа отдельно, так как они могут использоваться другими образами независимо друг от друга.
Редактировать :
Аналогичный вопрос представлен здесь, поскольку я понимаю, что предоставленный ответ требует, чтобы Docker должен быть установлен в контейнере A и требует привязки сокета докера (/var/run/docker.sock
) между хостом и контейнером A. Я не думаю, что это лучшая практика, это похоже на хак, который может создать проблемы безопасности.