【问题标题】:How to create a file using touch in Dockerfile or docker-compose?如何在 Dockerfile 或 docker-compose 中使用 touch 创建文件?
【发布时间】:2019-03-12 10:14:00
【问题描述】:

我想通过Dockerfiledocker-compose.yml 使用touch 创建一个空的数据库文件并将其卷起来。实际上,我可以在容器中手动创建它,如下所示:

docker exec -it <container-name> bash
# touch /app/model/modbus.db

然而,当我使用以下过程时,它会抛出 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

除此之外,我还通过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

[注意]:

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

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

TL;DR:

如何将新文件从容器发送到主机中不存在的主机? (也就是说,它是在容器内完成的,而不是在宿主机内)

【问题讨论】:

    标签: docker ubuntu docker-compose dockerfile


    【解决方案1】:

    我不确定docker-compose.yml,但您拥有的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 进入容器并能够找到该文件。

    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 
    

    【讨论】:

    • 我用“在容器和主机之间创建文件并对其进行卷”更新了我的问题
    • 这就是我要找的。谢谢!
    【解决方案2】:

    将以下内容放入您的 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 中的卷属性,而当我删除它时,它有效。
    • 这是它的相关错误:unknown: Are you trying to mount a directory onto a file (or vice-versa)? Check if the specified host path exists and is the expected type
    • 好的,我想我知道你现在真正的问题是什么了。更新了我的答案。
    • 我的问题是,在 docker-compose 中没有任何touch 命令和音量命令,它会创建一个带有modbus.db 的文件夹而不是文件,我在我的问题“注意”中提到过
    • 那么您确定本地主机上的 ./model/modbus.db 是文件而不是目录吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-28
    • 2021-11-22
    • 2021-06-02
    • 2020-04-06
    • 2021-09-15
    相关资源
    最近更新 更多