Может видеть файл в контейнере Docker, но не может получить к нему доступ - PullRequest
0 голосов
/ 10 мая 2018

Я новичок в Docker и столкнулся со следующей проблемой:

В моем Dodckerfile есть следующие строки:

ADD dir/archive.tgz /dir/
RUN tar -xzf /dir/archive2.tar.gz -C /dir/
RUN ls -l /dir/
RUN ls -l /dir/dir1/

Первый ls распечатывает файлы правильно, и я вижу, что dir1 был создан внутри dir архивом с разрешениями drwxr-xr-x. Но второй ls дает мне: ls: "невозможно получить доступ к / dir / dir1 /: нет такого файла или каталога"

Я подумал, что если Docker может видеть файл, он может получить к нему доступ. Нужно ли здесь делать особую магию?

1 Ответ

0 голосов
/ 10 мая 2018

Я думал, что, если Докер может увидеть файл, он может получить к нему доступ.

  • В каком-то смысле вы правы, но при этом упускаете часть информации. Эти команды RUN не обязательно выполняются последовательно, поскольку docker работает в слоях, а ваша третья команда RUN выполняется, а ваша первая может быть пропущена. Чтобы сохранить правильный порядок выполнения, вам нужно поместить их в одну и ту же команду RUN как таковую, чтобы они оказались на одном уровне (и были обновлены вместе):

    RUN tar -xzf /dir/archive2.tar.gz -C /dir/ && \
        ls -l /dir/ && \
        ls -l /dir/dir1/
    

    Это распространенная проблема, чаще всего, когда она помещается в Dockerfile:

    RUN apt-get update
    RUN apt-get install some-package
    

    Вместо этого:

    RUN apt-get update && \
        apt-get install some-package
    

Примечание. Это соответствует рекомендациям по использованию команды RUN в Dockerfile, описанным здесь: https://docs.docker.com/develop/develop-images/dockerfile_best-practices/#run и позволяет избежать возможной путаницы с кешами / слоями ...

Чтобы воссоздать вашу проблему, это небольшой тест, похожий на ваш, в зависимости от фактической структуры каталогов в вашем архиве это может отличаться:

  • Пустой архив 2 с созданным dir / dir1 / somefile.txt:

    mkdir -p ~/test-sowf/dir/dir1 && cd ~/test-sowf && echo "Yay" | tee --append dir/dir1/somefile.txt && tar cvzf archive2.tar.gz dir && rm -rf dir
    
  • Dockerfile, созданный в ~ / test-sowf со следующим содержимым

    from ubuntu:latest
    COPY archive2.tar.gz /dir/
    RUN tar xvzf /dir/archive2.tar.gz -C /dir/ && \
        ls -l /dir/ && \
        ls -l /dir/dir/dir1/
    
  • Команда построения выглядит так:

    docker build -t test-sowf .
    
  • Дает следующий результат:

    Sending build context to Docker daemon  5.632kB
    Step 1/3 : from ubuntu:latest
    ---> 452a96d81c30
    Step 2/3 : COPY archive2.tar.gz /dir/
    ---> Using cache
    ---> 852ef4f706d3
    Step 3/3 : RUN tar xvzf /dir/archive2.tar.gz -C /dir/ &&     ls -l    /dir/ &&     ls -l /dir/dir/dir1/
    ---> Running in b2ab281190a2
    dir/
    dir/dir1/
    dir/dir1/somefile.txt
    total 8
    -rw-r--r-- 1 root root  177 May 10 15:43 archive2.tar.gz
    drwxr-xr-x 3 1000 1000 4096 May 10 15:43 dir
    total 4
    -rw-r--r-- 1 1000 1000 4 May 10 15:43 somefile.txt
    Removing intermediate container b2ab281190a2
    ---> 05b7dfe52e36
    Successfully built 05b7dfe52e36
    Successfully tagged test-sowf:latest
    
  • Обратите внимание, что извлеченные файлы имеют размер 1000: 1000, а не root: root для архива, поэтому, если вы не используете другой пользователь (не root), у вас не должно быть проблем с пользователем, но, в зависимости от в вашем архиве вы можете столкнуться с проблемами пути (/ dir / dir / dir1, как показано здесь).

  • проверить, что файл правильный и содержит 'Yay' внутри:

    docker run --rm --name test-sowf test-sowf:latest cat /dir/dir/dir1/somefile.txt
    
  • очистить тестовый беспорядок впоследствии (намеренно не используя rm -rf, но очищая отдельные файлы):

    docker rmi test-sowf && cd && rm ~/test-sowf/archive2.tar.gz && rm ~/test-sowf/Dockerfile && rmdir ~/test-sowf
    
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...