【问题标题】:Dockerfile can't find shell script on build [duplicate]Dockerfile在构建时找不到shell脚本[重复]
【发布时间】:2019-08-20 15:45:50
【问题描述】:

我正在尝试使用 docker 构建一个使用 go 的应用程序。要安装 go,dockerfile 有以下命令(顺便说一句,这执行得很好):

RUN wget https://dl.google.com/go/go1.11.linux-amd64.tar.gz \
    && tar -xf go1.11.linux-amd64.tar.gz \
    && mv go /usr/local

当脚本在 'install' 子目录中运行 shell 文件时会出现问题。注意,以下两步的输出:

Step 9/13 : RUN . install/install-lmdb-linux.sh
 ---> Running in 0c666807720a
: not found install/install-lmdb-linux.sh:
: not found install/install-lmdb-linux.sh:
-e

Installing LMDB

Cloning into 'lmdb'...
: not found install/install-lmdb-linux.sh:
make: Entering directory '/root/bystro/lmdb/libraries/liblmdb'
gcc -pthread -O2 -g -W -Wall -Wno-unused-parameter -Wbad-function-cast -Wuninitialized   -c mdb.c
gcc -pthread -O2 -g -W -Wall -Wno-unused-parameter -Wbad-function-cast -Wuninitialized   -c midl.c
ar rs liblmdb.a mdb.o midl.o
ar: creating liblmdb.a

这个 shell 脚本似乎失败了,但不知何故恢复了(?)并继续构建:

Step 11/13 : RUN . install/install-go-packages.sh
 ---> Running in 7700bf77c2b1
: not found install/install-go-packages.sh:
-e

Installing go packages (bystro-vcf, stats, snp)

: not found install/install-go-packages.sh:
: not found install/install-go-packages.sh:
: not found install/install-go-packages.sh:
Made /root/go path
: not found install/install-go-packages.sh:
: not found install/install-go-packages.sh:
: not found: install/install-go-packages.sh:
: not found: install/install-go-packages.sh:
: not found: install/install-go-packages.sh:
: not found: install/install-go-packages.sh:
: not found: install/install-go-packages.sh:
: not found: install/install-go-packages.sh:
The command '/bin/sh -c . install/install-go-packages.sh' returned a non-zero code: 127

此脚本是构建失败的地方,退出代码为 127(未找到命令)。该脚本的任务基本上只是为应用程序“安装”一些依赖项。

我的调试:

在弄乱了两个 RUN 函数的变体之后,我最终决定记录一些情况:我检查两个 shell 脚本是否真的存在于运行时,并查看 Go 是否存在于运行时。两人都在场。

Step 9/15 : RUN ls install/
 ---> Running in 0f0ad051b009
export-bystro-libs.sh
export-go-path-linux.sh
install-apt-deps.sh
install-go-linux.sh
install-go-mac.sh
install-go-packages.sh
install-liftover-linux.sh
install-lmdb-linux.sh
install-mac-deps.sh
install-perl-libs.sh
install-perlbrew-linux.sh
install-rpm-deps.sh
update-packages.sh
Step 12/15 : RUN go version
 ---> Running in b8b9d08ef9c3
go version go1.11 linux/amd64

另外,请注意,当我手动运行它们时,这两个脚本都能完美执行。

问题:

为什么我的构建失败了?似乎 Docker 有脚本、执行它们的工具以及执行此操作的正确指令,所以我不知道如何处理。

【问题讨论】:

  • 您是否尝试过尽可能使用完整路径?
  • @Aserre Step 9/13 : RUN C:/Users/mikof/Documents/WINGO/Docker/bystro/install/install-lmdb-linux.sh ---> Running in f1a9d78df5cd /bin/sh: 1: C:/Users/mikof/Documents/WINGO/Docker/bystro/install/install-lmdb-linux.sh: not found The command '/bin/sh -c C:/Users/mikof/Documents/WINGO/Docker/bystro/install/install-lmdb-linux.sh' returned a non-zero code: 127
  • 您的某些输入文件中似乎有 DOS 回车符。使用前转换为 Unix 文件格式,或者更好的是,根本不要使用 Windows。
  • 还有127退出码错误
  • RUN 命令中的路径应该是指 Docker 镜像中的路径,而不是你运行它的主机上的路径。

标签: linux bash shell docker go


【解决方案1】:

如果您不想使用绝对路径。 有一个命令可以改变你的工作目录

WORKDIR /your/directory

然后使用 RUN 执行你的 shell 命令

参考:Change directory command in Docker?

【讨论】:

  • 注意,我不认为我使用的是绝对路径。我使用的命令是:RUN . install/install-lmdb-linux.sh。此外,路径本身似乎是正确的,因为RUN ls install/ 返回了正确的文件名(如问题所述)。
猜你喜欢
  • 2023-01-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-08-17
相关资源
最近更新 更多