«Почему команды, запускаемые в Dockerfile, не создают постоянные файлы в контейнере?» - PullRequest
0 голосов
/ 01 мая 2019

Простые команды, которые я запускаю в 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 создают файлы, которые позже исчезают (и не обновляются в моем локальном каталоге)?

1 Ответ

1 голос
/ 01 мая 2019
volumes:
  - '.:/usr/src/myapp'

Вы монтируете текущий каталог поверх /usr/src/myapp, поэтому все, что там находится, скрыто под монтированием.

Возможно, вам следует вместо этого COPY файлы ваших приложений в контейнере.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...