我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Docker 运行错误:exec /app/backend/server:没有这样的文件或目录

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Docker 运行错误:exec /app/backend/server:没有这样的文件或目录

在使用Docker时,有时会遇到一些运行错误,比如出现了"exec /app/backend/server:没有这样的文件或目录"的错误提示。这个错误可能会让人感到困惑,不知道该如何解决。针对这个问题,php小编鱼仔为大家提供了一些解决方法,希望能帮助到大家。接下来,我们就一起来看一下如何解决这个问题。

问题内容

我在尝试运行 Docker 容器时遇到问题。我从 Dockerfile 构建了一个镜像:

docker build -t server -f ./backend/Dockerfile .

运行它:

docker run -it -p 8081:8081 server

出现错误:

exec /app/backend/server: no such file or directory

当我从 Docker Desktop 进行检查时,我会在容器内看到该文件存在,并且已按照应有的位置创建到该位置。

我还尝试更改第二阶段FROM golang:1.21-alpine,但仍然遇到相同的错误。

随着来自 gcr.io/distroless/base-debian11 我得到:

/app/backend/server: /lib/aarch64-linux-gnu/libc.so.6: version `GLIBC_2.33' not found (required by /app/backend/server)
/app/backend/server: /lib/aarch64-linux-gnu/libc.so.6: version `GLIBC_2.32' not found (required by /app/backend/server)
/app/backend/server: /lib/aarch64-linux-gnu/libc.so.6: version `GLIBC_2.34' not found (required by /app/backend/server)

我看了这里、这里并尝试了很多东西。我对 Docker 比较陌生,不知道如何解决这个问题。有人可以帮助我了解可能导致此错误的原因以及如何解决它吗?提前致谢!

下面是我的 Dockerfile:

# Stage 1: Building the application
FROM golang:1.21 AS builder

WORKDIR /app

COPY go.mod go.sum ./
RUN go mod download

COPY . ./

RUN apt-get update && apt-get install -y sqlite3 libsqlite3-dev
RUN CGO_ENABLED=1 GOOS=linux go build -a -installsuffix cgo -o /app/backend/server ./backend/backend.go

# Stage 2: Production stage using Alpine
FROM alpine:latest

RUN apk --no-cache add ca-certificates sqlite 

COPY ./backend/configs/config /app/configs/config
COPY ./database/sqlite/schema.sql /app/database/sqlite/schema.sql

COPY ./tls/server.crt /tls/server.crt
COPY ./tls/server.key /tls/server.key

COPY --from=builder /app/backend/server /app/backend/server

EXPOSE 8081

ENTRYPOINT ["/app/backend/server"]

解决方法

我用简化的 dockerfile 和应用程序复制了您的问题(请尝试提供最小、可重现的示例 -我不得不猜测你正在使用哪个 sqlite 库):

backend.go

package main

import (
    "database/sql"
    "log"
    "os"

    _ "github.com/mattn/go-sqlite3"
)

func main() {
    os.Remove("./foo.db")

    db, err := sql.Open("sqlite3", "./foo.db")
    if err != nil {
        log.Fatal(err)
    }
    defer db.Close()

    sqlStmt := `
    create table foo (id integer not null primary key, name text);
    delete from foo;
    `
    _, err = db.Exec(sqlStmt)
    if err != nil {
        log.Printf("%q: %s\n", err, sqlStmt)
        return
    }
}

dockerfile:

# Stage 1: Building the application
FROM golang:1.21 AS builder
WORKDIR /app
COPY go.mod go.sum ./
RUN go mod download
COPY . ./
RUN apt-get update && apt-get install -y sqlite3 libsqlite3-dev
RUN CGO_ENABLED=1 GOOS=linux go build -a -installsuffix cgo -o /app/server

# Stage 2: Production stage using Alpine
FROM alpine:latest
RUN apk --no-cache add ca-certificates sqlite
COPY --from=builder /app/server /app/server
EXPOSE 8081
ENTRYPOINT ["/app/server"]

在容器中启动一个shell(docker run -it --entrypoint /bin/sh server)我们可以看到可执行文件在那里,权限很好,但它不运行:

/ # ls -al /app/server
-rwxr-xr-x    1 root     root       6816280 Sep 22 02:29 /app/server
/ # /app/server
/bin/sh: /app/server: not found
/ # ldd /app/server
        /lib64/ld-linux-x86-64.so.2 (0x7ff8cb4ba000)
        libc.so.6 => /lib64/ld-linux-x86-64.so.2 (0x7ff8cb4ba000)
Error relocating /app/server: fcntl64: symbol not found

很容易看到错误“未找到”,并认为这一定是由于文件不在您期望的位置,或者权限不正确。但是,当可执行文件所依赖的内容丢失时,会显示相同的错误。 ldd 显示问题 - 可执行文件依赖于 fcntl64;该库由 glibc 提供,但不是 musl (如 Alpine 中使用的 - glibc musl 之间的不兼容性是 并不罕见)。

最简单的解决方案是使用与运行应用程序相同的操作系统来编译应用程序:

# Stage 1: Building the application
FROM golang:1.21-alpine AS builder
WORKDIR /app
COPY go.mod go.sum ./
RUN go mod download
COPY . ./
RUN apk --no-cache add gcc g++ sqlite
RUN CGO_ENABLED=1 GOOS=linux go build -a -installsuffix cgo -o /app/server

# Stage 2: Production stage using Alpine
FROM alpine:latest
RUN apk --no-cache add ca-certificates sqlite
COPY --from=builder /app/server /app/server
EXPOSE 8081
ENTRYPOINT ["/app/server"]

然后运行这个(我的可执行文件没有输出,但我确认数据库已创建):

/ # ls -al /app/server
-rwxr-xr-x    1 root     root       6838120 Sep 22 02:39 /app/server
/ # /app/server
/ # ldd /app/server
        /lib/ld-musl-x86_64.so.1 (0x7fabcb701000)
        libc.musl-x86_64.so.1 => /lib/ld-musl-x86_64.so.1 (0x7fabcb701000)
/ # ls -al ./foo.db 
-rw-r--r--    1 root     root          8192 Sep 22 02:40 ./foo.db

另一种选择是使用 pure go 库(无需 CGO )。

以上就是Docker 运行错误:exec /app/backend/server:没有这样的文件或目录的详细内容,更多请关注编程网其它相关文章!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Docker 运行错误:exec /app/backend/server:没有这样的文件或目录

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

Docker 运行错误:exec /app/backend/server:没有这样的文件或目录

在使用Docker时,有时会遇到一些运行错误,比如出现了"exec /app/backend/server:没有这样的文件或目录"的错误提示。这个错误可能会让人感到困惑,不知道该如何解决。针对这个问题,php小编鱼仔为大家提供了一些解决方法
Docker 运行错误:exec /app/backend/server:没有这样的文件或目录
2024-02-08

Docker 没有这样的文件或目录

php小编小新为你解答:在使用Docker时,有时会遇到"Docker 没有这样的文件或目录"的错误提示。这个错误通常意味着Docker在执行指定命令时无法找到所需的文件或目录。造成这个错误的原因可能有很多,例如文件或目录不存在、路径设置错
Docker 没有这样的文件或目录
2024-02-10

错误:命令“ cl.exe”失败:没有这样的文件或目录

这个错误是因为系统找不到 `cl.exe` 这个命令。`cl.exe` 是 Microsoft Visual C++ 的编译器命令,它通常安装在 Visual Studio 中。要解决这个问题,你可以尝试以下几个步骤:1. 确保已经安装了
2023-09-16

Docker 构建失败:lstat /root/go:没有这样的文件或目录

Golang不知道大家是否熟悉?今天我将给大家介绍《Docker 构建失败:lstat /root/go:没有这样的文件或目录》,这篇文章主要会讲到等等知识点,如果你在看完本篇文章后,有更好的建议或者发现哪里有问题,希望大家都能积极评论指出
Docker 构建失败:lstat /root/go:没有这样的文件或目录
2024-04-04

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录