【问题标题】:sh: curl: not found even install curl inside k8s podsh: curl: not found 甚至在 k8s pod 中安装 curl
【发布时间】:2021-04-18 22:08:19
【问题描述】:

这可能是一个简单的问题,但我找不到合适的解决方案。

我有一个如下所示的 Docker 映像。我想做的事情只是在 kubernetes pod 中运行 curl 命令,但我收到如下错误。我也无法通过 bash 执行。

$ kubectl exec -ti hub-cronjob-dev-597cc575f-6lfdc -n hub-dev sh
Defaulting container name to hub-cronjob.
Use 'kubectl describe pod/hub-cronjob-dev-597cc575f-6lfdc -n hub-dev' to see all of the containers in this pod.
/usr/src/app $ curl
sh: curl: not found

用 bash 试过

$ kubectl exec -ti cronjob-dev-597cc575f-6lfdc -n hub-dev bash
 mand in container: failed to exec in container: failed to start exec "8019bd0d92aef2b09923de78753eeb0c8b60a78619543e4cd27069128a30da92": OCI runtime exec failed: exec failed: container_linux.go:349: starting container process caused "exec: \"bash\": executable file not found in $PATH": unknown

Dockerfile

FROM node:12-alpine AS builder

# Variables from outside
ARG NODE_ENVIRONMENT=development
ENV NODE_ENV=$NODE_ENVIRONMENT

# Create app directory
WORKDIR /usr/src/app

#Install curl
RUN apk --no-cache add curl -> did not work
RUN apk update && apk add curl curl-dev bash -> did not work

# Install app dependencies
COPY package*.json ./
RUN npm install

# Bundle app source
COPY . .

# Build Stage 2
# Take the build from the previous stage
FROM node:12-alpine

WORKDIR /usr/src/app
COPY --from=builder /usr/src/app /usr/src/app

# run the application
EXPOSE 50005 9183

CMD [ "npm", "run", "start:docker" ]

【问题讨论】:

  • 你必须在你的镜像中自己安装curl,例如:RUN apk --no-cache add curl
  • 你可以在本地试用你的镜像,没有理由在它工作之前将它部署到kubernetes。
  • 只有最后FROM 行之后的内容才会包含在最终图像中。

标签: docker kubernetes dockerfile


【解决方案1】:

您的 Dockerfile 包含多个阶段,也称为 multi-stage build

每一个FROM声明都是一个新的阶段和一个新的形象。在您的情况下,您有两个阶段:

  • builder 构建应用并安装 curl 的地方
  • second stagebuilder 阶段复制 /usr/src/app

在这种情况下,第二个FROM node:12-alpine 语句将仅包含您从第一阶段复制的基本 alpine 包、节点工具和 /usr/src/app。

如果您想在最终图像中使用 curl,您需要在第二阶段安装 curl(在第二阶段 FROM node:12-alpine 之后):

FROM node:12-alpine AS builder

# Variables from outside
ARG NODE_ENVIRONMENT=development
ENV NODE_ENV=$NODE_ENVIRONMENT

# Create app directory
WORKDIR /usr/src/app

# Do not install 

# Install app dependencies
COPY package*.json ./
RUN npm install

# Bundle app source
COPY . .

# Build Stage 2
# Take the build from the previous stage
FROM node:12-alpine

#Install curl
RUN apk update && apk add curl

WORKDIR /usr/src/app
COPY --from=builder /usr/src/app /usr/src/app

# run the application
EXPOSE 50005 9183

CMD [ "npm", "run", "start:docker" ]

正如 cmets 中提到的,您可以通过直接运行 docker 容器来测试它 - 无需在 k8s 集群中运行 pod:

docker build -t image . && docker run -it image sh -c 'which curl'

对于以编译型编程语言实现的应用程序,通常使用多阶段构建。

  1. 在第一阶段,您安装所有必要的开发工具和编译器,然后将源代码编译成二进制文件。由于您不需要也可能不希望在生产映像中使用源和开发人员工具,因此您应该创建一个新阶段。
  2. 在第二阶段,您复制已编译的二进制文件并将其作为 CMD 或 ENTRYPOINT 运行。这样,您的图像只包含可执行代码,从而使它们更小。

【讨论】:

    猜你喜欢
    • 2015-05-28
    • 2019-06-05
    • 1970-01-01
    • 1970-01-01
    • 2021-09-28
    • 2023-02-19
    • 1970-01-01
    • 2020-09-26
    • 1970-01-01
    相关资源
    最近更新 更多