Dockerfile COPY с хоста на контейнер работает, но когда docker-compose.yml использует том, файл в контейнере не виден хосту - PullRequest
0 голосов
/ 13 февраля 2019

Использование контекста:

test workspace

Цель состоит в том, чтобы скопировать test.txt в контейнер и сделать его видимым в папке tst хоста.Папка tst содержит уже существующий файл tst.txt.

Использование приложения Docker:

Docker application

Использование .dockerignore:

.DS_Store
.vscode
.dockerignore
Dockerfile
docker-compose.yml
**/tst

Использование файла Docker:

FROM alpine:latest
RUN apk add --no-cache bash
WORKDIR /app
RUN echo "$(echo "pwd:")" "$(pwd)"  <<-- returns pwd: /app 
COPY test.txt .
RUN ls -la . 
CMD ["sh", "-c", "ls -la ."]

Использование файла docker-compose:

version: '3.7'
services:
  app:
    build: .
    volumes:
      - ./tst:/app

Запуск docker-compose up приводит к:

Creating network "sof_default" with the default driver
Building app
Step 1/7 : FROM alpine:latest
latest: Pulling from library/alpine
6c40cc604d8e: Downloading [>                                                  
----------
Step 3/7 : WORKDIR /app
---> Running in cf58e5a10d23
Removing intermediate container cf58e5a10d23
---> 76fb51298933
Step 4/7 : RUN echo "$(echo "pwd:")" "$(pwd)"
---> Running in 07135f745883
pwd: /app
Removing intermediate container 07135f745883
---> 45acc1c04a12
Step 5/7 : COPY test.txt .
---> de0ce42397b9
Step 6/7 : RUN ls -la . <<- the output shows test.txt was copied into the container's /app directory
---> Running in 60371e9516c1
total 12
drwxr-xr-x    1 root     root          4096 Feb 12 21:25 .
drwxr-xr-x    1 root     root          4096 Feb 12 21:25 ..
-rw-r--r--    1 root     root            15 Feb 12 19:19 test.txt
Removing intermediate container 60371e9516c1
---> 3d514dac4f61
Step 7/7 : CMD ["sh", "-c", "ls -la . && cat test.txt"]
---> Running in db644643a844
Removing intermediate container db644643a844
---> ad9f6988d31d

Successfully built ad9f6988d31d
Successfully tagged sof_app:latest
WARNING: Image for service app was built because it did not already exist. To rebuild this image you must use `docker-compose build` or `docker-compose up --build`.
Creating sof_app_1 ... done
Attaching to sof_app_1
app_1  | total 8
app_1  | drwxr-xr-x    3 root     root            96 Feb 12 20:50 .
app_1  | drwxr-xr-x    1 root     root          4096 Feb 12 21:25 ..
app_1  | -rw-r--r--    1 root     root            45 Feb 12 20:51 tst.txt
app_1  | cat: can't open 'test.txt': No such file or directory
sof_app_1 exited with code 1

Вывод показывает, что text.txt был скопирован в контейнер, но он не виден на хосте.Почему это так?

https://docs.docker.com/compose/faq/ говорит

"Вы можете сделать так, чтобы изображение включало в себя код, используя КОПИРОВАТЬ, и использовать том в вашем файле Compose для включениякод от хоста во время разработки. Том переопределяет содержимое каталога изображения. "

Последнее предложение означает, что любые файлы или папки на томе хоста переопределяют файлы с тем же именемв отображенном каталоге изображения.Я не ожидал бы, что каталог хоста полностью перезапишет каталог образа, удалив все файлы, уже находящиеся в нем.Я ошибаюсь в этом предположении?

Любое хорошее руководство приветствуется.

1 Ответ

0 голосов
/ 13 февраля 2019

Связанные подключенные тома полностью переопределяют каталог, который вы указали в файле compose, поэтому вы не увидите файлов, скопированных в каталог / app с помощью dockerfile.

Вы должны использовать либо анонимные, либо именованные тома, чтобыДокер копирует файлы в объявленном томе перед монтированием.[1]

Если вы все еще хотите использовать подключенные тома, то единственный вариант - скопировать файлы, когда контейнер уже запущен (не в файле Docker).

[1] https://docs.docker.com/engine/reference/builder/#volume

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...