“为什么在Dockerfile中运行命令不会在容器中创建持久文件?”

问题描述 投票:0回答:1

当我运行docker-compose build时,我在Dockerfile中运行的简单命令被执行,但是当我运行docker-compose up并查看容器内部时,它们创建的文件不显示。

我一直在尝试运行一些dockerized 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的文件,它被命令lscat检查存在。

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命令似乎创建后来消失的文件(并且在我的本地目录中没有更新)?

docker docker-compose
1个回答
1
投票
volumes:
  - '.:/usr/src/myapp'

您正在将当前目录挂载到/usr/src/myapp的顶部,因此其中的所有内容都隐藏在挂载下方。

也许你应该将你的应用程序文件COPY放入容器中。

© www.soinside.com 2019 - 2024. All rights reserved.