Запись данных в файл в Dockerfile
у меня есть сценарий оболочки, script.sh, который записывает несколько строк в файл:
#!/usr/bin/env bash
printf "blah
blah
blah
blahn" | sudo tee file.txt
теперь в моем Dockerfile я добавляю этот скрипт и запускаю его, а затем пытаюсь добавить сгенерированный file.txt
:
ADD script.sh .
RUN chmod 755 script.sh && ./script.sh
ADD file.txt .
когда я делаю выше, я просто получаю ошибку, ссылаясь на :
lstat file.txt: no such file or directory
почему docker не может найти файл, который генерирует мой сценарий оболочки? Где я смогу его найти?
2 ответов
когда вы RUN chmod 755 script.sh && ./script.sh
Он фактически выполняет этот скрипт внутри контейнер docker (т. е.: в слое docker).
когда вы ADD file.txt .
вы пытаетесь добавить файл на своем местные файловая система внутри контейнера docker (т. е. в новом слое docker).
вы не можете сделать это, потому что файл.txt не существует на вашем компьютере.
на самом деле у вас уже есть этот файл внутри docker, попробуйте docker run --rm -ti mydockerimage cat file.txt
и вы должны увидеть его содержимое отображается
это потому, что Docker загружает весь контекст каталога (где находится ваш Dockerfile) в демон Docker в начале. Из докер докс,
сборка выполняется демоном Docker, а не CLI. Первое, что делает процесс сборки, - это отправляет весь контекст (рекурсивно) демону. В большинстве случаев лучше начать с пустого каталога в качестве контекста и сохранить файл Dockerfile в этом каталоге. Добавить только файлы, необходимые для построения Файла Docker.
поскольку ваш текстовый файл был недоступен в начале, вы получите это сообщение об ошибке. Если вы все еще хотите, чтобы этот текстовый файл был добавлен в образ Docker, вы можете вызвать команду "docker build" из того же файла сценария. Изменить script.sh,
#!/usr/bin/env bash
printf "blah
blah
blah
blah\n" | sudo tee <docker-file-directory>/file.txt
docker build --tag yourtag <docker-file-directory>
и измените файл Dockerfile, чтобы добавить сгенерированный текстовый файл.
ADD file.txt
.. <rest of the Dockerfile instructions>