Как создать файл, используя touch в Dockerfile или docker-container? - PullRequest
2 голосов
/ 12 марта 2019

Я хочу создать пустой файл БД, используя touch в Dockerfile или docker-compose.yml, и разместить его между контейнером и хостом. Я могу создать его вручную в этом контейнере, выполнив следующую процедуру: хорошо:

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
        network_mode: "host"
        container_name: collector
        restart: unless-stopped

        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

[ Примечание ]:

Без command: bash -c "touch /app/model/modbus.db" в docker-compose.yml, который вызывает exited with code 0 ошибки; будет создан каталог с именем modbus.db вместо файла из-за следующего раздела:

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

[UPDATE]

TL; DR:

Как отправить новый файл из контейнера на хост, который не существует на хосте? (что сделано внутри контейнера, а не в хосте)

Ответы [ 2 ]

1 голос
/ 12 марта 2019

Поместите следующее в ваш docker-compose.yml

volumes:
  - "./model:/app/model"

Это создаст папку / app / model внутри вашего контейнера. Его содержимое (которое вы создадите внутри контейнера) будет доступно на ./model на вашем хосте.

Если вы поместите команду touch в CMD вашего Dockerfile, этот файл будет создан после запуска контейнера, когда том также будет инициализирован. Таким образом, следующий Dockerfile должен работать:

FROM python:3.6-slim

ENV PYTHONUNBUFFERED 1

RUN mkdir /app
WORKDIR /
ADD . /app
CMD touch /app/model/modbus.db && python app
0 голосов
/ 12 марта 2019

Я не уверен насчет docker-compose.yml, но dockerfile, который у вас, похоже, работает на меня.

Dockerfile выглядит так,

FROM python:3.6-slim

RUN mkdir /app
WORKDIR /
RUN touch /app/modbus.db

Постройте файл docker,

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 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...