Как добавить динамический файл в контейнер docker

#docker

#docker

Вопрос:

всякий раз, когда я запускаю контейнер docker, я хочу отправить динамическое имя файла в качестве некоторой переменной среды.

Это доступно в контейнере, поэтому оно выводит его значение, когда мы «повторяем».

Но команда ADD не добавляет этот файл.

Dockerfile:

 ADD $filename ./
echo ls # Not showing file
  

запуск docker -e filename=’/path/to/file.extension’

Ответ №1:

Попробуйте вместо этого использовать том:

 $ echo "hello world" > somefile.txt
$ docker run -it --rm -v $PWD/somefile.txt:/data/somefile.txt alpine cat /data/somefile.txt
hello world
  

В Dockerfile перечислены действия, которые выполняются при запуске «сборки docker». Невозможно передать переменную среды во время выполнения, потому что в этот момент изображение уже создано 🙂

Комментарии:

1. Объемный подход — хорошая идея, спасибо. Обратите внимание, вы можете установить переменные среды для своих контейнеров во время выполнения с помощью команд docker run --env and docker run --env-file . Полезная техника — особенно помогает сохранить локальные настройки env и пароли / другие секреты из образов Docker.

2. @ChrisJohnson я полностью согласен, и веб-сайт 12 Factor рекомендует использовать переменные среды ( 12factor.net/config ). Однако в этом случае была предпринята попытка использовать переменную среды в Dockerfile, что-то может поддерживаться только во время сборки Docker. Поскольку на этот вопрос был дан ответ, Docker теперь поддерживает аргументы сборки, см.: docs.docker.com/engine/reference/commandline/build /…

Ответ №2:

ADD выполняется во время компиляции (сборки). Когда вы запускаете docker exec -e это после сборки контейнера.

Вы не можете добавлять динамические файлы, потому что они скомпилированы. Предыдущая команда о томах верна, потому что вы можете предоставить эти файлы ad-hoc во exec время и попросить ваше приложение забрать их.

Ответ №3:

чтобы добавить к ответу Марка.

Если вы хотите использовать файл docker-compose.yml (хорошая идея, если вы планируете запускать контейнер снова и снова).

 mysql:
  image: mysql
  volumes:
    - /someLocalFolder/lib/mysql/:/var/lib/mysql
  

таким образом, вы можете добавить столько томов, сколько захотите, включая отдельные файлы, которые могут быть удобны для настройки и т. Д.