создание папки в определенной папке / home из производного образа докера не работает - PullRequest
1 голос
/ 26 октября 2019

В Dockerfile у меня есть папки из моего производного изображения /home и /root. Я не могу создать папку в каталоге /home:

RUN mkdir -p / home / TEST_3

Сообщения об ошибках не отображаются, но я вижу, что папкане был создан. Эта же команда работает нормально в каталоге /root

Другая папка выглядит схожей по разрешению:

drwxr-xr-x   2 root root 4096 Apr 24  2018 home
drwx------   1 root root 4096 Jun 20 08:38 root

Количество жестких ссылок отличается. Проблемная папка /home имеет больше разрешений

Еще одна странная вещь: я могу создать папку в /home, используя:

WORKDIR / home / TEST_2

но тогда любой файл, который я создаю в этой папке, кажется, не существует.

Здесь маленький Dockerfile, чтобы воссоздать эту проблему / функцию

# Specify the base image and tag
FROM gcr.io/deeplearning-platform-release/pytorch-cpu:m27

RUN ls -la
RUN ls -la /home/
RUN ls -la /root/

## creation ofthe folder is working and the folder exist (and I can create a file in the new folder)
RUN mkdir -p /root/TEST_1
RUN ls -la /root/TEST_1
RUN touch /root/TEST_1/new_file.txt
RUN ls -la /root/TEST_1

## creation of the folder is working and the folder exist but the file created doesn't exist
WORKDIR /home/TEST_2
WORKDIR /
RUN ls -la /home/TEST_2
RUN touch /home/TEST_2/new_file.txt
RUN ls -la /home/TEST_2

## creation of the folder succeed (no error messages), but the folder doesn't exist
RUN mkdir -p /home/TEST_3
RUN ls -la /home/TEST_3
RUN touch /home/TEST_3/new_file.txt
RUN ls -la /home/TEST_3

и здесьвывод:

 docker build -f Dockerfile_test .
Sending build context to Docker daemon  37.89kB
Step 1/17 : FROM gcr.io/deeplearning-platform-release/pytorch-cpu:m27
 ---> 7eb6565a8cc6
Step 2/17 : RUN ls -la
 ---> Running in 1ced0ed2bf49
total 80
drwxr-xr-x   1 root root 4096 Oct 26 12:52 .
drwxr-xr-x   1 root root 4096 Oct 26 12:52 ..
-rwxr-xr-x   1 root root    0 Oct 26 12:52 .dockerenv
drwxr-xr-x   1 root root 4096 Jun 20 08:20 bin
drwxr-xr-x   2 root root 4096 Apr 24  2018 boot
drwxr-xr-x   5 root root  340 Oct 26 12:52 dev
-rwxr-x--x   1 root root   94 Jun 19 21:51 entrypoint.sh
-rwxr-xr-x   1 root root    0 Jun 20 08:38 env.sh
drwxr-xr-x   1 root root 4096 Oct 26 12:52 etc
drwxr-xr-x   2 root root 4096 Apr 24  2018 home
drwxr-xr-x   1 root root 4096 Jun 20 08:22 lib
drwxr-xr-x   2 root root 4096 Jun 12 16:55 lib64
drwxr-xr-x   2 root root 4096 Jun 12 16:54 media
drwxr-xr-x   2 root root 4096 Jun 12 16:54 mnt
drwxr-xr-x   1 root root 4096 Jun 20 08:23 opt
dr-xr-xr-x 226 root root    0 Oct 26 12:52 proc
drwx------   1 root root 4096 Jun 20 08:38 root
drwxr-xr-x   1 root root 4096 Jun 20 08:33 run
-rwxr-x--x   1 root root  109 Jun 19 21:51 run_jupyter.sh
drwxr-xr-x   1 root root 4096 Jun 20 08:20 sbin
drwxr-xr-x   2 root root 4096 Jun 12 16:54 srv
dr-xr-xr-x  13 root root    0 Oct 26 12:52 sys
drwxrwxrwt   1 root root 4096 Jun 20 10:09 tmp
drwxr-xr-x   1 root root 4096 Jun 20 08:33 usr
drwxr-xr-x   1 root root 4096 Jun 12 16:55 var
Removing intermediate container 1ced0ed2bf49
 ---> 87dbdffa7315
Step 3/17 : RUN ls -la /home/
 ---> Running in 756f013caf7f
total 8
drwxr-xr-x 2 root root 4096 Apr 24  2018 .
drwxr-xr-x 1 root root 4096 Oct 26 12:52 ..
Removing intermediate container 756f013caf7f
 ---> 24419a25ac99
Step 4/17 : RUN ls -la /root/
 ---> Running in bde249ae0452
total 52
drwx------ 1 root root 4096 Jun 20 08:38 .
drwxr-xr-x 1 root root 4096 Oct 26 12:52 ..
-rw-r--r-- 1 root root 3106 Apr  9  2018 .bashrc
drwxr-xr-x 3 root root 4096 Jun 20 08:31 .cache
drwxrwsr-x 1 root root 4096 Jun 20 08:26 .conda
drwx------ 4 root root 4096 Jun 20 08:33 .config
-rw-r--r-- 1 root root  401 Jun 20 08:33 .gitconfig
drwxr-xr-x 3 root root 4096 Jun 20 08:38 .ipython
drwxr-xr-x 1 root root 4096 Jun 20 10:10 .jupyter
drwxr-xr-x 3 root root 4096 Jun 20 08:31 .npm
-rw-r--r-- 1 root root  148 Aug 17  2015 .profile
-rw-r--r-- 1 root root  405 Jun 20 10:10 .wget-hsts
drwxrwxrwx 1 root root 4096 Jun 20 10:09 miniconda3
Removing intermediate container bde249ae0452
 ---> f6e6b3780145
Step 5/17 : RUN mkdir -p /root/TEST_1
 ---> Running in 95ffe0bc574f
Removing intermediate container 95ffe0bc574f
 ---> a87cac09ec17
Step 6/17 : RUN ls -la /root/TEST_1
 ---> Running in b8fd10afa3ee
total 8
drwxr-xr-x 2 root root 4096 Oct 26 12:52 .
drwx------ 1 root root 4096 Oct 26 12:52 ..
Removing intermediate container b8fd10afa3ee
 ---> 87b173385d4b
Step 7/17 : RUN touch /root/TEST_1/new_file.txt
 ---> Running in cbdd9ac79955
Removing intermediate container cbdd9ac79955
 ---> 0f57f2c15855
Step 8/17 : RUN ls -la /root/TEST_1
 ---> Running in 0a7d46a44e9e
total 8
drwxr-xr-x 1 root root 4096 Oct 26 12:53 .
drwx------ 1 root root 4096 Oct 26 12:52 ..
-rw-r--r-- 1 root root    0 Oct 26 12:53 new_file.txt
Removing intermediate container 0a7d46a44e9e
 ---> 5413892c3b96
Step 9/17 : WORKDIR /home/TEST_2
 ---> Running in d0322094ae3b
Removing intermediate container d0322094ae3b
 ---> 9815f6870830
Step 10/17 : WORKDIR /
 ---> Running in f84feebf3db9
Removing intermediate container f84feebf3db9
 ---> 5c85f2fadd04
Step 11/17 : RUN ls -la /home/TEST_2
 ---> Running in 4644cbcd5c3c
total 8
drwxr-xr-x 2 root root 4096 Oct 26 12:53 .
drwxr-xr-x 3 root root 4096 Oct 26 12:53 ..
Removing intermediate container 4644cbcd5c3c
 ---> c82625e638d9
Step 12/17 : RUN touch /home/TEST_2/new_file.txt
 ---> Running in ac89ce336a51
Removing intermediate container ac89ce336a51
 ---> d9569d5ca42d
Step 13/17 : RUN ls -la /home/TEST_2
 ---> Running in 999f75b4ece1
total 8
drwxr-xr-x 2 root root 4096 Oct 26 12:53 .
drwxr-xr-x 3 root root 4096 Oct 26 12:53 ..
Removing intermediate container 999f75b4ece1
 ---> 57062c0ccf0a
Step 14/17 : RUN mkdir -p /home/TEST_3
 ---> Running in f9788ac58dc7
Removing intermediate container f9788ac58dc7
 ---> e88a503ae524
Step 15/17 : RUN ls -la /home/TEST_3
 ---> Running in 16ea32c637c6
ls: cannot access '/home/TEST_3': No such file or directory
The command '/bin/sh -c ls -la /home/TEST_3' returned a non-zero code: 2

Я использую Docker version 19.03.4, build 9013bf5 на MacOS 10.14.6

Мои вопросы следующие:

  1. где происходит разница (бытьвозможность создать папку в /root, но не в /home
  2. , как исправить эту проблему, чтобы иметь возможность создать папку в /home и иметь возможность создавать файлы в новой папке.

1 Ответ

2 голосов
/ 26 октября 2019

TL; DR

В чем разница между / home и / root

/ home имеет том, связанный с ним

как обойти проблему

создать файл в точке входа (после построения контейнера), ИЛИ создать файл внутри тома (я использую первый вариант в моем длинном ответе)

Длинный ответ:

Выполнение docker inspect containerId после построения образа и контейнера показывает их тома, связанные с домашним каталогом:

"Source": "/var/lib/docker/volumes/1447dbc568742221a757a650427f38fb485e42fc7c6e959f33966922fe862d13/_data",
                "Destination": "/home",

Том RW (прочитаноwrite), так что вы можете записать в файл один раз внутри контейнера. (Я тестировал, используя docker exec -it containerId /bin/sh, затем touch /home/TEST_2/new_file.txt)

Попробуйте использовать скрипт Entrypoint для создания папок / файлов.

Редактировать:

Я хотел увидеть сам, но столкнулся с парой препятствий. В родительском контейнере (gcr.io/deeplearning-platform-release/pytorch-cpu:m27) уже есть файл entrypoint.sh.

Кроме того, добавление команды CMD или ENTRYPOINT переопределит родителейконтейнер точки входа (который вам, вероятно, нужен).

рабочий раствор :

С хоста скопируйте файл entrypoint.sh (при условии, что вы хотите изменить его на своем хосте)). docker cp containerId:/entrypoint.sh .

Измените точку входа, добавив команды TOUCH:

#!/bin/bash
touch /home/TEST_2/new_file.txt # <-- I added this
. /env.sh
. /root/miniconda3/etc/profile.d/conda.sh
conda activate base
exec "$@"

Измените ваш файл Docker, чтобы скопировать новый entrypoint.sh, который заменит существующий:

COPY entrypoint.sh /entrypoint.sh

Ваши команды листинга при запуске будут такими же, но если вы войдете в контейнер, вы увидите ваш файл:

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