Docker - проблема WORKDIR на альпийском изображении (многоступенчатая сборка) - PullRequest
2 голосов
/ 20 февраля 2020

У меня есть второй этап для моего файла Docker:

############################################ MULTI STAGE BUILD PART 2 ##############################################

# Start from alpine image
FROM alpine

# Creating work directory
WORKDIR /service

# Copy the certificats and executable into new Docker image
COPY --from=builder /etc/ssl/certs/ca-certificates.crt /etc/ssl/certs/
COPY --from=builder /service/main /service/
COPY --from=builder /service/.credentials /service/.credentials/

# Expose port
EXPOSE ${GRPC_PORT}
EXPOSE ${REST_PORT}

## Get required ARGs and put them into ENVs variables
ARG ENVIRONMENT
ARG NAMESPACE
ARG GRPC_PORT
ARG REST_PORT
ENV _ENVIRONMENT=${ENVIRONMENT}
ENV _NAMESPACE=${NAMESPACE}
ENV _GRPC_PORT=${GRPC_PORT}
ENV _REST_PORT=${REST_PORT}

### HERE YOU CAN TEST WITH ANY OF THE FOLLOWING ENTRYPOINT

# The One I need
ENTRYPOINT /main "ENVIRONMENT=${_ENVIRONMENT}" "NAMESPACE=${_NAMESPACE}" "GRPC_PORT=${_GRPC_PORT}" "REST_PORT=${_REST_PORT}"

# This one isn't able to resolve ENVs variables, but I use it as an example for my ISSUE
ENTRYPOINT [ "/main" ]

Как видите, для WORKDIR установлено значение / service

Однако, если вы Запустив образ с первой точкой входа, вы получите:

/bin/sh: /main: not found

А если вы запустите со второй точкой входа, вы получите:

docker: Error response from daemon: OCI runtime create failed: container_linux.go:346: starting container process caused "exec: \"/main\": stat /main: no such file or directory": unknown.

Примечание: Другим интересным моментом является COPY --from = builder ... , где мне нужно установить dest как /service/, иначе мой файл будет скопирован в / каталог


В соответствии с документацией :

Инструкция WORKDIR устанавливает рабочий каталог для любого RUN, CMD , ENTRYPOINT, COPY и ADD инструкции, которые следуют этому в Dockerfile.


Есть идеи? Это действительно касается меня или Docker / alpine?

1 Ответ

1 голос
/ 20 февраля 2020

Entrypoint должен быть ./main.

/main - это абсолютный путь, который будет относиться к основному, который был на вашем root.

Поскольку вы находитесь в /service, вам понадобится относительный путь. Вы хотите ./main, что указывает на /service/main.

...