Запись данных в файл в 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>