Простые команды, которые я запускаю в Dockerfile, выполняются, когда я запускаю docker-compose build
, однако создаваемые ими файлы не отображаются, когда я запускаю docker-compose up
и заглядываю внутрь контейнера.
Я пытался запустить несколько докеризованных приложений ruby и узлов, но продолжаю работать с той же проблемой. Здесь я представляю минимальную версию моей проблемы.
У меня есть такая файловая структура:
myapp
|-----Dockerfile
|-----docker-compose.yml
|-----checkFiles.py
Dockerfile
является
FROM python:3.7-alpine
WORKDIR /usr/src/myapp
RUN ls
RUN echo "this is a test" > myfile.txt
RUN ls
RUN cat myfile.txt
CMD python3 checkFiles.py
docker-compose.yml
является
version: '3.5'
services:
myapp:
build: .
volumes:
- '.:/usr/src/myapp'
и, наконец, checkFiles.py
- это программа для проверки наличия в текущем каталоге файла с именем Dockerfile
и файла с именем myfile.txt
:
import time
from pathlib import Path
import sys
config = Path('Dockerfile')
if config.is_file():
print("Dockerfile exists!")
else:
print("Dockerfile doesn't exist!")
config = Path('myfile.txt')
if config.is_file():
print("myfile.txt exists!")
else:
print("myfile.txt doesn't exist!")
print("Waiting for Death...")
sys.stdout.flush()
time.sleep( 100 )
Когда я запускаю docker-compose build
, я вижу, что изначально в контейнере ничего нет (ls
ничего не возвращает), затем я создаю файл с именем myfile.txt
, который проверяется на наличие команд ls
и cat
.
Step 6/7 : RUN cat myfile.txt
---> Running in 51491381d2b8
this is a test
Однако
при запуске docker-compose up
вывод равен
myapp_1 | Dockerfile exists!
myapp_1 | myfile.txt doesn't exist!
myapp_1 | Waiting for Death...
Указывает, что в контейнере нет myfile.txt
.
Более того, если я открою другой терминал и попытаюсь увидеть внутри контейнера, я также могу проверить, действительно ли нет myfile.txt
:
$ docker-compose exec myapp ls
Dockerfile checkFiles.py docker-compose.yml
Однако я могу создать файл в контейнере с помощью команды exec
, и он также мгновенно появится в моем локальном каталоге (в соответствии с volume
, установленным на docker-compose.yml
)
$ docker-compose exec myapp echo "created using exec" > test.txt
Файл test.txt
мгновенно появляется и в моем локальном каталоге.
Я знаю, что мой вопрос был длинным, но я хотел охватить все детали, поэтому
Почему команды Dockerfile
RUN
создают файлы, которые позже исчезают (и не обновляются в моем локальном каталоге)?