当我运行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
的文件,该文件由命令检查是否存在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
命令似乎会创建后来消失的文件(并且不会在我的本地目录中更新)?
答案 0 :(得分:1)
volumes:
- '.:/usr/src/myapp'
您正在将当前目录安装在/usr/src/myapp
上方,因此其中的所有内容都隐藏在安装下方。
也许您应该将应用程序文件COPY
放入容器中。