如何在 Dockerfile 或 docker-compose 中使用 touch 创建文件?

Ben*_*ari 6 ubuntu docker dockerfile docker-compose

我想使用touchbyDockerfiledocker-compose.yml并对其进行卷创建一个空的数据库文件。实际上,我可以在容器中手动创建它,如下所示:

docker exec -it <container-name> bash
# touch /app/model/modbus.db
Run Code Online (Sandbox Code Playgroud)

然而,当我使用以下过程时,它会抛出exited with code 0并停止:

version: '3'

services:
    collector:
        build: .
        image: collector:2.0.0    
        command: bash -c "touch /app/model/modbus.db"  # Note
#        command: bash /app/bashes/create_an_empty_db.sh

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

        tty: true
Run Code Online (Sandbox Code Playgroud)

除此之外,我也尝试过但Dockerfile没有成功:

FROM python:3.6-slim

ENV PYTHONUNBUFFERED 1

RUN mkdir /app
WORKDIR /
ADD . /app
RUN touch /app/model/modbus.db  # Note
CMD python app
Run Code Online (Sandbox Code Playgroud)

[笔记]:

也没有command: bash -c "touch /app/model/modbus.db"其中docker-compose.yml的原因exited with code 0modbus.db由于以下部分,将创建一个名为的目录而不是文件:

volumes:
  - "./model/modbus.db:/app/model/modbus.db:rw"
Run Code Online (Sandbox Code Playgroud)

长话短说:

如何从容器发送一个主机上不存在的新文件到主机上?(换句话说,它是在容器内部完成的,而不是在主机中完成的)

cod*_*aus 2

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

volumes:
  - "./model:/app/model"
Run Code Online (Sandbox Code Playgroud)

这将在容器内创建一个 /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
Run Code Online (Sandbox Code Playgroud)