【问题标题】:Can't run Curl command inside my Docker Container无法在我的 Docker 容器中运行 Curl 命令
【发布时间】:2016-04-06 22:02:14
【问题描述】:

我从我的 OS X VM Docker 主机创建了一个 docker 容器。我使用 run 命令创建了它,并根据 docker hub 上的 ubuntu:xenial 映像创建了容器。

在创建容器并以 root 身份登录并在容器内的命令提示符处登录后,我现在已连接到容器。

我尝试安装自制软件,但由于某种原因,我无法运行安装自制软件的命令:

ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"

当我运行时,我得到一个 bash:

curl:找不到命令

不知道为什么我不能在容器内使用 curl。

【问题讨论】:

  • 为什么不直接从 zip 安装 curl 呢? curl 在你磁盘上的任何地方吗?
  • 基于 Ubuntu 镜像,你可以使用 apt-get install curl -y。运行 apt-get update && apt-get upgrade -y && apt-get install curl -y CMD /bin/bash

标签: docker installation


【解决方案1】:

curl:找不到命令

是一个很大的提示,你必须安装它:

apt-get update; apt-get install curl

【讨论】:

  • 嗨,我为什么要使用 sudo?容器无论如何都不知道 sudo..Nirojan 的回答有效
  • 我认为你必须删除 sudo 才能在 docker 中工作
  • 你假设它将是一个 debian 映像。在这种情况下是正确的答案,但是较小的 unix 图像呢,有什么帮助吗?
  • @mahboudz 这意味着您正在使用的图像有另一个包管理器。您使用的是哪个图像?其他常见的是 yum 和 dnf,即您可能想尝试yum install curldnf install curl
  • 就我而言,解决方案略有不同:apk update; apk add curl
【解决方案2】:

在我的 Dockerfile 中使用 CURL 命令时遇到了同样的问题。正如 Gilles 指出的,我们必须先安装 curl。这些是要添加到“Doc​​kerfile”中的命令。

FROM ubuntu:16.04

# Install prerequisites
RUN apt-get update && apt-get install -y \
curl
CMD /bin/bash

【讨论】:

  • 正在安装curl,但如果您使用curl 控制命令,请注意wget 可能已经预先安装在容器中,所以如果您重写curl 语法改为使用wget,结果可能是更小的容器图像。
【解决方案3】:

所以我在 docker 容器运行后添加了 curl。

(这是用于调试容器...我不需要永久添加)

我运行了我的图像

docker run -d -p 8899:8080 my-image:latest

(以上使我的“应用程序”在我的机器上的端口 8899 上可用)(对这个问题不重要)

然后我在运行的容器中列出并创建了终端。

docker ps
docker exec -it my-container-id-here /bin/sh

如果上面的exec 命令不起作用,请查看这篇 SOF 文章:

Error: Cannot Start Container: stat /bin/sh: no such file or directory"

然后我跑了:

apk

只是为了证明它存在于正在运行的容器中,然后我运行了:

apk add curl

得到以下结果:

apk 添加卷曲

获取http://dl-cdn.alpinelinux.org/alpine/v3.8/main/x86_64/APKINDEX.tar.gz

获取http://dl-cdn.alpinelinux.org/alpine/v3.8/community/x86_64/APKINDEX.tar.gz

(1/5) 安装 ca 证书 (20171114-r3)

(2/5) 安装 nghttp2-libs (1.32.0-r0)

(3/5) 安装 libssh2 (1.8.0-r3)

(4/5) 安装 libcurl (7.61.1-r1)

(5/5) 安装 curl (7.61.1-r1)

执行busybox-1.28.4-r2.trigger

执行 ca-certificates-20171114-r3.trigger

好的:18 MiB,35 个包

然后我运行 curl:

/ # curl
curl: try 'curl --help' or 'curl --manual' for more information
/ # 

注意,要“退出”钻孔终端窗口,我必须打开一个 new 终端窗口并停止正在运行的容器:

docker ps
docker stop my-container-id-here

追加:

如果您没有“apk”(这取决于您使用的基本映像),请尝试使用“另一个”安装程序。从这里的其他答案中,您可以尝试:

apt-get -qq update

apt-get -qq -y install curl

【讨论】:

  • 感谢一步一步的解释!
【解决方案4】:

出现这种情况是因为镜像中没有包缓存,需要运行:

apt-get -qq update

在安装软件包之前,如果您的命令位于 Dockerfile 中,那么您需要:

apt-get -qq -y install curl

然后安装 ZSH 和 GIT Core:

apt-get install zsh
apt-get install git-core

zsh 在ubuntu 中工作很奇怪,因为sh 不理解源命令。所以,你这样做是为了安装zsh

wget https://github.com/robbyrussell/oh-my-zsh/raw/master/tools/install.sh -O - | zsh

然后你把你的 shell 改成 zsh:

chsh -s `which zsh`

然后重启:

sudo shutdown -r 0

这个问题在这个issue中有深入的解释。

【讨论】:

  • 安装zsh与解决方案无关。
【解决方案5】:

如果您使用的是基于 Alpine 的图像,则必须这样做

RUN
... \
apk add --no-cache curl \
curl ...
...

【讨论】:

  • 为什么是--no-cache
  • 嗯,明白了:我们不希望缓存的包文件留在我们的图像中。手感不错。
【解决方案6】:

你不需要安装curl来下载文件到Docker容器中,使用ADD command,例如

ADD https://raw.githubusercontent.com/Homebrew/install/master/install /tmp
RUN ruby -e /tmp/install

注意:将以上行添加到您的 Dockerfile 文件中。


另一个安装Azure CLI的例子:

ADD https://aka.ms/InstallAzureCLIDeb /tmp
RUN bash /tmp/InstallAzureCLIDeb

【讨论】:

  • 与接受的答案相比,耗时更少。不过只有一个问题。 ADD 命令是在本地下载文件,然后将文件添加到图像中还是在图像中进行下载?
  • @RajaAnbazhagan 它是在您的Dockerfile(在您的主机上运行)的docker build 过程中下载的。由于它是由 Docker 进程直接构建的,因此我假设它是直接将文件下载到您的映像中。
猜你喜欢
  • 2019-05-05
  • 1970-01-01
  • 2020-06-26
  • 1970-01-01
  • 1970-01-01
  • 2019-03-08
  • 1970-01-01
  • 2018-07-06
  • 1970-01-01
相关资源
最近更新 更多