添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

一:难道文件在容器中没有执行权限?

针对这个操作,我在command命令中加入了chmod 700
运行结果:not found …

二:由于可执行文件是通过volume映射过去的,莫非哪里出了问题导致容器中不存在该文件?

为了验证上面的想法于是在command命令中加上了ls -l,运行结果显示是存在该文件的。

三:莫非是alphine的问题??

于是我直接将整个alphine镜像换成的golang,运行发现没有再报not fount异常。
这样基本就可以断定是alphine镜像的问题了,但是为什么会这样呢,经过一番搜索引擎操作,发现这样的原因:

Alpine 使用的标准库与大多数发行版不同,它使用的是 musl libc,这个库相比于 glibc 更小、更简单、更安全,但是与大家常用的标准库 glibc 并不兼容。

我们知道正常的golang应用的编译一般上会将大部分的依赖打包进二进制文件,但是某些包是需要依赖系统标准库的,只要代码中有使用到这样类似的包,应用就会去调用系统中对应的库,Golang使用cgo(允许go调用c)机制去实现这样的调取过程。

所以在知道原因后我们也就有些解决办法了。

一:不要直接使用alpine:latest镜像,而是使用官方给我们提供的golang:alpine版本(没有解决,照样会报not found异常-2021.6.14更新)
二:使用静态编译,静态编译将不使用动态链接库,所以可以在alpine:latest中使用。
三:增加软连接

mkdir /lib64
ln -s /lib/libc.musl-x86_64.so.1 /lib64/ld-linux-x86-64.so.2

其实在第三点的时候我们知道musl跟glic是兼容的所以采取增加软连接后就可以使用。那么如何增加软连接呢,难道是在容器创建了之后像第三点一样进入容器手动创建?如果有多个那不是得麻烦死。所以最好的办法是我们使用Dockerfile创建一个符合要求的镜像,然后我们再使用这个二次创建的镜像来开发。如:

//Dockerfile文件
FROM alpine:3.14
RUN mkdir /lib64 && ln -s /lib/libc.musl-x86_64.so.1 /lib64/ld-linux-x86-64.so.2

创建好Dockerfile文件后编译成镜像:

sudo docker build -t my-alpine:v1.0 .

然后在docker-compose中使用

//docker-compose.yml文件
version: "3"
services:
  app:
    image: my-alpine:v1.0
    volumes:
    - /work/testmysql/:/app
    working_dir: /app
    command: ./app
    ports:
    - 5885:5885

这样就以后就可以直接使用这个编译好的镜像了。
当然也可以直接使用我打包好的镜像:

docker pull nelsonjs/glibc-alpine:v1.0
                    如题,在docker-compose 编排Go应用的时候alphine容器出现可执行文件不存在的问题。猜测:一:难道文件在容器中没有执行权限?针对这个操作,我在command命令中加入了chmod 700运行结果:not found …二:由于可执行文件是通过volume映射过去的,莫非哪里出了问题导致容器中不存在该文件?为了验证上面的想法于是在command命令中加上了ls -l,运行结果显示是存在该文件的。三:莫非是alphine的问题??于是我直接将整个alphine镜像换成的gola
不想听我罗嗦,可以直接跳转到最后。
笔记本买回来自带windows10,然后由于好奇心重,又给它折腾装上了ubuntu(本来是想支持国产deepin,奈何问题太多)。万恶之源开始,ubuntu很多常用软件没法直接用apt安装,安装完微信,使用微信一会儿会自动退出登录,无奈卸载。但问题是:非dpkg/apt/snap方式安装,卸载也不知道怎么卸载,于是查找 wechat关键字,找到一个 wechat.sh。
部分help代码如下
				
docker-image-alpine-envsubst 在阿尔卑斯山上安装了envsubst的docker映像 $ docker pull suzukishunsuke/alpine-envsubst 在本地测试 Docker引擎 构建Docker映像进行测试。 $ make image 再者,alpine支持sh 而不是bash 步骤1: 下载key ~ # wget -q -O /etc/apk/keys/sgerrand.rsa.pub https://alpine-pkgs.sgerrand.com/sgerrand.rsa.pub 步骤2: 下载apk安装文件 wget https://github.com/sgerrand/alpine-pkg-glibc/releases/download/2
DockerImage是Docker体系的价值所在,没有丝毫得夸大其词。DockerImage作为容器运行环境的基石,彻底解放了Docker容器创建的生命力,也激发了用户对于容器运用的无限想象力。玩转Docker,必然离不开DockerImage的支持。然而“万物皆有源”,DockerImage来自何方,DockerImage又是通过何种途径传输到用户机器,以致用户可以通过DockerImage创建容器?回忆初次接触Docker的场景,大家肯定对两条命令不陌生:dockerpull和dockerrun。这两条命令,正是前者实现了DockerImage的下载。Docker
docker 遇到 bash: No such file or directory 或 sh: not found等问题猜测一: 该文件目录在宿主机的inode和在Docker内的inode不一致猜测二: 该程序在docker容器内缺少运行所依赖的库衍生问题 为了可以方便使用宿主机工具包,docker volume了宿主机的工具包目录,在容器内使用挂载目录的工具包时出现 bash: xxx: No...
所以导致很多程序命令失效, 解决方式:容器内安装 glibc 下载:wget https://github.com/sgerrand/alpine-pkg-glibc/releases/download/2.29-r0/glibc-2.29-r0.apk 安装:apk add glibc-2.29-r0.apk
问题: docker alpine镜像遇到 sh: xxx: not found 在容器内/app/目录下放置了可执行文件abc,启动时提示not found /app/startup.sh: line 5: ./abc : not found 由于alpine镜像使用的是musl libc而不是gnu libc,/lib64/ 是不存在的。但他们是兼容的,可以创建个软连接过去试试! 这种情况是因为动态链接库位置错误导致的,alpine镜像使用的是musl libc而不是gun libc.
root@446d7cf1606c:/etc/mysql# apt-get update Err:1 http://security.debian.org/debian-security buster/updates InRelease Temporary failure resolving 'security.debian.org' Err:2 http:/ 我们使用简单的v#版本方案标记每个发行版。 以下是可供选择的标签: andyshinn/alpine-abuild:v1 :基于Alpine 3.3 andyshinn/alpine-abuild:v2 :基于Alpine 3.4 andyshinn/alpine-abuild:v3 :基于Alpine 3.5 andyshinn/alpine-abuild:v4 :基于Alpine 3.6 andyshinn/alpine-abuild:v5 :基于Alpine 3.6 andyshinn/alpine-abuild:v6 :基于Alpine 3.7 andyshinn/alpine-abuild MYSQL_PASSWORD : app , MYSQL_USER_MONITORING : monitoring , MYSQL_PASSWORD_MONITORING : monitoring 自定义:在.env文件,更改不同的值以适合您的需求。 拉: docker pull quay.io/perriea/alpine-mysql:1.0 运行: docker run -d -p 3306:3306 --env-file .env quay.io/perriea/alpine-mysql:1.0
docker-compose not found、docker-compose命令不存在   centos 7python-pip模块不存在,是因为像centos这类衍生的发行版,源跟新滞后,或者不存在。即使使用yum去search python-pip也找不到软件包。   为了使用安装滞后或源不存在的安装包,需要安装扩展源EPEL。扩展源EPEL(http://fedorapro
这个错误信息表示在Docker容器执行apt-get命令时出现了问题,因为Docker镜像默认不包含apt-get命令,因此需要先安装apt-get命令所在的软件包。在Docker容器安装软件包的方式与在Linux服务器上是相同的。可以使用以下命令安装包含apt-get命令的软件包: $ apt-get update $ apt-get install -y apt-get 首先运行apt-get update命令更新软件包列表,然后运行apt-get install命令安装apt-get软件包。 这样,就可以在Docker容器使用apt-get命令了。此外,还应该使用-Dockerfile将安装apt-get软件包的步骤添加到Docker镜像构建,以便在使用该镜像创建容器时自动运行安装。