“为什么在Dockerfile中运行的命令没有在容器中创建持久性文件?”

时间:2019-04-30 23:05:43

标签: docker docker-compose

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

我一直在尝试运行一些dockerized的ruby和node应用程序,但是我仍然遇到相同的问题。在这里,我介绍了我的问题的最低版本。

我有这个文件结构:

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

1 个答案:

答案 0 :(得分:1)

volumes:
  - '.:/usr/src/myapp'

您正在将当前目录安装在/usr/src/myapp上方,因此其中的所有内容都隐藏在安装下方。

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