如何在Dockerfile或docker compose中使用触摸创建文件?

如何在Dockerfile或docker compose中使用触摸创建文件?,docker,ubuntu,docker-compose,dockerfile,Docker,Ubuntu,Docker Compose,Dockerfile,我想使用Dockerfile或docker compose.yml中的touch创建一个空DB文件,并在容器和主机之间对其进行卷装,我还可以通过以下步骤在此容器中手动创建它: docker exec -it <container-name> bash # touch /app/model/modbus.db 此外,我还尝试了Dockerfile todo,但没有成功: FROM python:3.6-slim ENV PYTHONUNBUFFERED 1 RUN mkdir /

我想使用
Dockerfile
docker compose.yml中的
touch
创建一个空DB文件,并在容器和主机之间对其进行卷装,我还可以通过以下步骤在此容器中手动创建它:

docker exec -it <container-name> bash
# touch /app/model/modbus.db
此外,我还尝试了Dockerfile todo,但没有成功:

FROM python:3.6-slim

ENV PYTHONUNBUFFERED 1

RUN mkdir /app
WORKDIR /
ADD . /app
RUN touch /app/model/modbus.db  # Note
CMD python app

[注意]:

如果没有
命令:docker-compose.yml中的bash-c“touch/app/model/modbus.db”
,则
退出,代码为0
错误原因;由于以下部分,将创建一个具有
modbus.db
名称的目录,而不是文件:

volumes:
  - "./model/modbus.db:/app/model/modbus.db:rw"

[更新]

TL;博士:


如何将容器中不存在的新文件发送到主机?(这是在容器内部完成的,而不是在主机中)

将以下内容放入docker-compose.yml中

volumes:
  - "./model:/app/model"
这将在容器内创建一个/app/model文件夹。其内容(您将在容器内创建)将在主机上的./model上可用

如果将touch命令放在Dockerfile的CMD中,则当卷也初始化时,启动容器后将创建该文件。因此,以下Dockerfile应该可以工作:

FROM python:3.6-slim

ENV PYTHONUNBUFFERED 1

RUN mkdir /app
WORKDIR /
ADD . /app
CMD touch /app/model/modbus.db && python app

我不确定docker compose.yml的
docker,但是你的
dockerfile
似乎在为我工作

Dockerfile
如下所示

FROM python:3.6-slim

RUN mkdir /app
WORKDIR /
RUN touch /app/modbus.db
构建dockerfile

docker build -t test .
Sending build context to Docker daemon  2.048kB
Step 1/4 : FROM python:3.6-slim
 ---> 903e8a0f0681
Step 2/4 : RUN mkdir /app
 ---> Using cache
 ---> c039967bf463
Step 3/4 : WORKDIR /
 ---> Using cache
 ---> c8c81ac01f50
Step 4/4 : RUN touch /app/modbus.db
 ---> Using cache
 ---> 785916fe4cea
Successfully built 785916fe4cea
Successfully tagged test:latest
建造容器

docker run -dit test
52cde500cda015f170140ae9e7174a0367b29265a49a3742173946b686179fb3
我将ssh'ed放入容器中,并能够找到该文件

docker exec -it 52cde500cda015f170140ae9e7174a0367b29265a49a3742173946b686179fb3 /bin/bash
root@52cde500cda0:/# ls
app  bin  boot  dev  etc  home  lib  lib64  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var
root@52cde500cda0:/# cd app
root@52cde500cda0:/app# ls
modbus.db 

我用“在容器和主机之间创建文件和卷”更新了我的问题-您的方式在docker compose中的卷属性不起作用,而当我删除它时,它起作用。这是它的相关错误:
unknown:您是否尝试将目录装载到文件上(反之亦然)?检查指定的主机路径是否存在,是否为预期类型
好的,我想我现在明白了您真正的问题所在。更新了我的答案。我的问题是,没有任何
touch
命令,docker compose中只有volume命令,它会用
modbus.db
创建一个文件夹,而不是我在问题“注意”中提到的文件,所以你确定本地主机上的/model/modbus.db是一个文件而不是一个目录吗?我用“在容器和主机之间创建文件和卷”
docker exec -it 52cde500cda015f170140ae9e7174a0367b29265a49a3742173946b686179fb3 /bin/bash
root@52cde500cda0:/# ls
app  bin  boot  dev  etc  home  lib  lib64  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var
root@52cde500cda0:/# cd app
root@52cde500cda0:/app# ls
modbus.db