Вы правы, что у вас нет выбора, кроме как использовать привязку здесь. Однако на чистом Docker уровне нет конкретного требования c, чтобы вы использовали один и тот же путь на стороне хоста и контейнера.
Типичная настройка для этого - выбрать некоторый фиксированный путь внутри контейнер и рассматривать это как часть внешнего интерфейса контейнера. Есть несколько способов справиться с этим; вероятно, лучше всего сделать так, чтобы скрипт принимал имя пути в качестве параметра
# Copy the application source into the same place as the Gemfile
# (This is a correction from the original Dockerfile)
COPY . /application
# When the container is launched, explicitly pass an alternate
# directory /data as a command-line parameter
# (Use JSON-array form for ENTRYPOINT so that additional parameters
# passed in CMD don't get swallowed)
ENTRYPOINT ["ruby", "/application/main.rb", "/data"]
, а затем передавал монтирование bind при его запуске
docker run \
--rm \ # delete the container on exit
-it \ # accept interactive input
-v $PWD:/data \ # mount current directory on /data
-u $(id -u) \ # run as host user ID
myscript # image name
# do not bind mount content over the image code
Даже при этом существует число вещей, которые контейнер не может сделать, например, запустить новое окно терминала. Точно так же Docker Compose обычно ориентирован на параллельную работу нескольких долго выполняющихся контейнеров, и он может не работать просто с docker-compose up
файлом, который вы показываете. (Я ожидаю, что docker-compose run script_library
сработает.)
Обратите внимание, что вы тратите немало усилий, чтобы обойти изоляцию файловой системы Docker, и по-прежнему существуют серьезные проблемы с безопасностью (что происходит если вы используете -u root -v /etc:/data
?). Для инструментов, основной целью которых является чтение и запись локальных файлов, Docker обычно не подходит как механизм упаковки. Это вдвойне верно, если скрипт находится в том же каталоге, что и файлы, над которыми вы работаете, как вы описали в вопросе; проще просто установить Ruby и запустить ruby main.rb
.