刚刚开始使用docker。我已经创建了一个映像,启动了一个容器,但是当我在容器中写入文件时,它会显示在本地磁盘上。我不知道为什么会这样,如果那样的话,我怎么可能运行图像的许多实例。
这就是我要做的
docker container ls
CONTAINER ID IMAGE COMMAND
CREATED STATUS PORTS NAMES
5bf6d45b4f79 docker_1_web "bundle exec rails s…" About an hour ago Up About an hour 0.0.0.0:3000->3000/tcp docker_1_web_1
d5d0991da014 postgres "docker-entrypoint.s…" About an hour ago Up About an hour 5432/tcp docker_1_db_1
然后
docker exec -it 5bf6d45b4f79 echo "hello" > temp.txt
和
docker exec -it 5bf6d45b4f79 cat temp.txt
hello
但是在Mac命令行上的本地磁盘上
cat temp.txt
hello
在我的Mac命令行上是
echo "goodbye" >> temp.txt
cat temp.txt
hello
goodbye
然后在容器中
docker exec -it 5bf6d45b4f79 cat temp.txt
hello
goodbye
Du!怎么来的?我以为Docker容器写入了自己的文件系统。所以我完全迷惑了。
这也意味着我无法运行图像的多个实例,因为它们都将写入相同的文件。
答案 0 :(得分:3)
让我们澄清一下:
操作时:
docker exec -it 5bf6d45b4f79 echo "hello" > temp.txt docker exec -it 5bf6d45b4f79 cat temp.txt hello
您正在容器中执行
echo "hello"
,但stdoutput存储在主机中。因此,在主机中看到temp.txt是正常的。
如果要将temp.txt保存在容器中,请尝试:
docker exec -it 5bf6d45b4f79 bash -c "echo 'hello' > temp.txt"
并且temp.txt将在您的容器工作目录上生成。
当您这样做:
但是在Mac命令行上的本地磁盘上
cat temp.txt hello Followed on my Mac command line by echo "goodbye" >> temp.txt cat temp.txt hello goodbye
然后在 容器
docker exec -it 5bf6d45b4f79 cat temp.txt hello goodbye
您正在共享temp.txt,也许是在主机和docker之间共享的
docker volume
中生成的
答案 1 :(得分:1)
docker exec -it 5bf6d45b4f79 echo "hello" > temp.txt
让您的容器打印hello
,然后> temp.txt
获取此输出并在您的主机上生成一个文件。
要使容器打印hello
,然后在自身内部创建temp.txt
,则必须使用:
docker container exec -it <your_container_name> sh -c 'echo "hello" > temp.txt'
sh -c
在容器内创建一个新的shell并运行echo "hello" > temp.txt'
。这意味着> temp.txt
部分将由此Shell处理,因此文件将在容器内创建。
您尝试执行此操作的方式是主机的外壳,该外壳处理命令的> temp.txt
部分,因此在主机上创建了文件。
答案 2 :(得分:0)
使用它来获取docker容器的终端并为主机打开一个单独的窗口。但这就是我的方法。
docker exec -it 5bf6d45b4f79 /bin/bash