当我运行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
的文件,它被命令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
命令似乎创建后来消失的文件(并且在我的本地目录中没有更新)?
volumes:
- '.:/usr/src/myapp'
您正在将当前目录挂载到/usr/src/myapp
的顶部,因此其中的所有内容都隐藏在挂载下方。
也许你应该将你的应用程序文件COPY
放入容器中。