linux - 在 Docker 容器中更新 apk 期间出现错误的文件描述符错误......为什么?

标签 linux docker dockerfile devops alpine

运行后:

docker network rm $NETNAME
docker network create --driver bridge $NETNAME --subnet "${SUBNET}0/24"
docker run --name $NODENAME -it --net $NETNAME --ip 192.168.0.2 --volume --detach $IMGNAME

在容器内,作为 root,我运行 apk udpdate :
# apk update
fetch http://dl-cdn.alpinelinux.org/alpine/v3.7/main/x86_64/APKINDEX.tar.gz
ERROR: http://dl-cdn.alpinelinux.org/alpine/v3.7/main: Bad file descriptor
WARNING: Ignoring APKINDEX.70c88391.tar.gz: Bad file descriptor
fetch http://dl-cdn.alpinelinux.org/alpine/v3.7/community/x86_64/APKINDEX.tar.gz
ERROR: http://dl-cdn.alpinelinux.org/alpine/v3.7/community: Bad file descriptor
WARNING: Ignoring APKINDEX.5022a8a2.tar.gz: Bad file descriptor
2 errors; 33 distinct packages available

...然后点击 Bad file descriptor错误。

还有许多其他人遇到了同样的错误:

CDN seems to be down and cannot get mirrors working #280

Repository problem? #279

关于如何解决此范围的建议来自:

"It's a DNS lookup error. Just add google DNS servers (8.8.8.8, 8.8.4.4) to your Docker host's deamon config file."



... 到 ...

"Add the following to your Dockerfile:"

RUN echo http://mirror.yandex.ru/mirrors/alpine/v3.5/main > /etc/apk/repositories; \ echo http://mirror.yandex.ru/mirrors/alpine/v3.5/community >> /etc/apk/repositories



(您不应该这样做。永远不要添加来自非官方来源的软件包。)

解决方案

解决方案很简单。将这两行添加到您的 RUN 命令中:
rm -rf /var/cache/apk && \
mkdir /var/cache/apk && \

在 Dockerfile 中...
RUN apk add --update --no-cache bash \
    git \
    make \
    clang \
    g++ \
    go && \
    mkdir -p $REPO && \
    mkdir -p $GODIR/src && \
    rm -rf /usr/share/man && \
    rm -rf /var/cache/apk && \
    mkdir /var/cache/apk && \
    apk del git clang

添加命令以删除和重新创建 /var/cache/apk目录感觉就像一个黑客。

我的 hack 有效,但是这个错误的根本原因是什么,谁应该修复它?

最佳答案

--no-cache选项允许不在本地缓存索引。
这有助于保持容器较小。
此外,它相当于 apk update在顶部和 rm -rf /var/cache/apk/到底。
所以你可以尝试这样使用它:

RUN apk add --update --no-cache bash \
    git \
    make \
    clang \
    g++ \
    go && \
    mkdir -p $REPO && \
    mkdir -p $GODIR/src && \
    rm -rf /usr/share/man && \
    apk del git clang

关于linux - 在 Docker 容器中更新 apk 期间出现错误的文件描述符错误......为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48736212/

相关文章:

linux - "no space left on device"- 在 ubuntu 机器上运行 docker-compose 时。无助于清理和重启

asp.net - 无法访问 Docker 内的 Asp.Net Core

docker - 我无法使用 Docker 构建我的 docker 文件来创建我的 docker 镜像

Docker-compose:在 env 文件中设置一个变量并在 Dockerfile 中使用它

c - C中目录和文件列表的正则表达式

linux - 使用 grep 和 cut 过滤文本文件以仅显示以  ‘m’  ‘w’ 或  ‘s’ 开头的用户名及其主目录

Azure 容器服务无法访问

node.js -/bin/sh : sequelize: not found when I try to run express. js 应用程序与 docker-compose

ruby-on-rails - 带 puma 和 nginx systemd 的 Rails 5

c++ - OpenSSL:接受TLS连接,然后转移到另一个进程