Докер: При запуске с флагом тома (-v) Ошибка ответа от демона: Ошибка создания среды выполнения OCI - PullRequest
0 голосов
/ 29 декабря 2018

Я пытаюсь dockerize мой первый Go проект (хотя вопрос не имеет никакого отношения к Go, я думаю!).

Краткое резюме (о том, что делает код) - он просто проверяет наличие папки .cache и создает ее, если она не существует.

После докеризации проекта моя цель - смонтировать путь в контейнере, в котором .cache создан, к пути к хосту

Вот мой Dockerfile (Multistaged):

FROM golang as builder

ENV GO111MODULE=on

WORKDIR /proj

COPY go.mod .
COPY go.sum .
RUN go mod download

COPY . .
RUN CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build

RUN ls
FROM alpine
COPY --from=builder /proj/project /proj/
RUN chmod a+x  /proj/project
ENTRYPOINT [ "/proj/project" ]

РЕДАКТИРОВАТЬ: Если я запускаю что-то вроде этого (как упоминал @Jan Garaj в комментариях):

 docker run --rm -v "`pwd`/data/.cache:/proj/.cache/"  project-image:latest

не выдает ошибку, но создаетпустая папка data/.cache на хосте без актуальных (контентных) файлов и папок из каталога .cache контейнера.Хотя исполняемый файл внутри контейнера может создавать каталог .cache и его последующие файлы и папки.

Я знаю, варианты этой проблемы задавались много раз, но поверьте мне, я опробовал все эти решения. Ниже приведены некоторые из вопросов:

  1. Ошибка ответа от демона: Ошибка создания среды выполнения OCI: container_linux.go: 296

  2. Проблема GitHub, котораявыглядело знакомо - все еще не имеет ответа и открыто.

  3. Еще одна проблема GitHub - Возможно, лучшая ссылка на данный момент, но я все еще не могне заставить его работать.

Тот факт, что удаление флага громкости заставляет команду run работать, меня сильно смущает.

Может кто-нибудь объяснить, что происходит в этом случае и указать мне правильное направление.

PS - Также я запускаю докер на MacOS (macOS High Sierra, если быть точным), и мне пришлось включить общий доступ к файлам в Docker-> Preferences -> File Sharing с путем монтирования хоста (просто дополнительная информация !!).

Само собой разумеется, что я также пытался переопределить ENTRYPOINT, пытаясь запустить что-то вроде /bin/sh /proj/project, которое также не работало (поскольку он не мог найти исполняемый файл project даже после упоминанияполный путь от root).Я где-то читал, что изображение alpine имеет только sh и не имеет bash.Я также изменяю привилегии моего исполняемого файла project при сборке image на a+x, что тоже не работает.

Пожалуйста, дайте мне знать, если какая-то часть вопроса неясна.Я также проверил свой код здесь, в GitHub , если кто-то хочет воспроизвести ошибку.

1 Ответ

0 голосов
/ 29 декабря 2018

Когда вы монтируете подкаталог вашего рабочего каталога data в каталог /proj внутри контейнера, вся папка, включая двоичный файл, который вы скомпилировали и скопировали в него, больше не будет доступна.Вместо этого содержимое вашего каталога data будет доступно внутри вашего контейнера вместо /proj.По сути, вы «скрываете» версию каталога с изображением контейнера и заменяете ее каталогом вне контейнера.

Это происходит потому, что флаг -v с указанным вами аргументом создаетbind mount и использует второй параметр (/proj) в качестве цели монтирования.

Чтобы решить проблему, либо скопируйте двоичный файл в другой каталог (и соответственно измените инструкцию ENTRYPOINT), либо выберитедругая цель для крепления bind.

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