docker - sh: curl: not found 甚至在 k8s pod 中安装 curl
问题描述
这可能是一个简单的问题,但我找不到合适的解决方案。
我有一个如下所示的 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" ]
解决方案
您的 Dockerfile 由多个阶段组成,也称为多阶段构建。
每FROM
一句话都是一个新的阶段,一个新的形象。在您的情况下,您有两个阶段:
builder
你在哪里构建你的应用程序并安装 curlsecond stage
从builder
舞台复制 /usr/src/app
在这种情况下,第二个FROM node:12-alpine
语句将仅包含您从第一阶段复制的基本 alpine 包、节点工具和 /usr/src/app。
如果您想在最终图像中使用 curl,则需要curl
在第二阶段(在 second 之后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" ]
正如评论中提到的,您可以通过直接运行 docker 容器来测试它 - 无需在 k8s 集群中运行 pod:
docker build -t image . && docker run -it image sh -c 'which curl'
对于以编译的编程语言实现的应用程序,通常使用多阶段构建。
- 在第一阶段,您安装所有必要的开发工具和编译器,然后将源代码编译成二进制文件。由于您不需要并且可能不希望在生产映像中使用源和开发人员工具,您应该创建一个新阶段。
- 在第二阶段,您复制编译的二进制文件并将其作为 CMD 或 ENTRYPOINT 运行。这样,您的图像仅包含可执行代码,从而使它们更小。
推荐阅读
- python - numpy.argsort 函数返回 ValueError:要解包的值太多(预期为 1)
- python - 制作一个新的 df,保留 1 个重复的日期时间,但保留 pandas df 上其他重复项的行值
- python - 如何在 discord.py 模块中添加嵌入
- reactjs - TypeError: (X) 不是函数
- python - 如何在 Python websockets 中一次运行获得多个响应?
- python - 在我的自定义构建模型上出现“InvalidArgumentError:所需的可广播形状”错误
- javascript - 无法更改在 flex 按钮旁边添加的另外 2 个按钮的位置
- redux - Hot to get state from Redux RTK mutation in another component
- python - 如何从外部函数获取参数?Python
- c++ - 具有不同数量参数的函数中的 C++ 代码重复