我正在尝试对具有两个目录中文件的应用程序进行Docker化:
BOTFILES/
...
ChatScript/
BINARIES/
LinuxChatScript64
DICT/
...
在我的Dockerfile中,我分别复制了每个目录。
FROM alpine:3.9
# https://github.com/ChatScript/ChatScript
RUN mkdir /bot
COPY ChatScript/ /bot/ChatScript
RUN chmod +x /bot/ChatScript/BINARIES/LinuxChatScript64
COPY BOTFILES/ /bot/BOTFILES
WORKDIR /bot/ChatScript
EXPOSE 1024
CMD ["./BINARIES/LinuxChatScript64"]
chmod +x
正常工作,但是当我尝试运行容器时,出现以下错误:
standard_init_linux.go:207: exec user process caused "no such file or directory"
如果我将CMD行更改为/bin/ash
,则可以得到一个有效的终端,并看到BINARIES/LinuxChatScript64
文件在那里并且具有执行许可权。但是,即使尝试从交互式终端运行它,也会得到/bin/ash: ./BINARIES/LinuxChatScript64: not found
。这样我可以看到文件,可以cat
看到文件,但是运行文件只会使我得到一个文件未找到错误。我想念什么?
答案 0 :(得分:1)
如果是二进制文件,是否可以动态链接?它可能缺少共享库依赖项。在主机上检查ldd
以获得列表。
如果是脚本,是否安装了脚本的解释器?例如,Alpine并未预装bash,因此使用它的脚本将失败并显示“未找到”:
$ docker run -it --rm alpine:latest /bin/ash
/ # echo '#!/bin/bash' > script
/ # chmod +x script
/ # ./script
/bin/ash: ./script: not found
/ # apk add bash
fetch http://dl-cdn.alpinelinux.org/alpine/v3.9/main/x86_64/APKINDEX.tar.gz
fetch http://dl-cdn.alpinelinux.org/alpine/v3.9/community/x86_64/APKINDEX.tar.gz
(1/5) Installing ncurses-terminfo-base (6.1_p20190105-r0)
(2/5) Installing ncurses-terminfo (6.1_p20190105-r0)
(3/5) Installing ncurses-libs (6.1_p20190105-r0)
(4/5) Installing readline (7.0.003-r1)
(5/5) Installing bash (4.4.19-r1)
Executing bash-4.4.19-r1.post-install
Executing busybox-1.29.3-r10.trigger
OK: 14 MiB in 19 packages
/ # ./script