docker 找不到入口点文件

wtzytmuj  于 2023-03-01  发布在  Docker
关注(0)|答案(8)|浏览(184)

我有一个带有以下命令的Docker映像:

FROM ruby:2.4-alpine
WORKDIR /usr/src/app

COPY Gemfile /usr/src/app/Gemfile
COPY Gemfile.lock /usr/src/app/Gemfile.lock

RUN bundle config build.nokogiri --use-system-libraries
RUN bundle install --without development test

VOLUME /state

COPY . /usr/src/app/

ENTRYPOINT ["api-entrypoint.sh"]
CMD ["foreman", "start"]

它构建正确,但是当我尝试运行bash时,例如,我得到了container_linux.go:247: starting container process caused "exec: \"api-entrypoint.sh\": executable file not found in $PATH" docker: Error response from daemon: oci runtime error: container_linux.go:247: starting container process caused "exec: \"api-entrypoint.sh\": executable file not found in $PATH".
我尝试复制入口点文件,并使用CMD给予其可执行权限...但没有任何效果

ao218c7q

ao218c7q1#

我在使用Docker for Windows时遇到了这个问题,解决方案是将入口点脚本文件从CRLF -〉LF更改。

kyxcudwk

kyxcudwk2#

我遇到了同样的问题--找不到入口点,但我确信它就在那里。
看起来您不能对入口点/命令使用单引号'
所以我从

ENTRYPOINT ['/foo/bar/script.sh']
CMD ['run']

ENTRYPOINT ["/foo/bar/script.sh"]
CMD ["run"]

而且很有效。

628mspwn

628mspwn3#

/usr/src/app可能不在您的路径中,因此您应包括脚本的完整路径。您还需要确保您的entrypoint.sh是可执行的,Docker将完全按照您的生成主机上的权限复制权限,因此根据您的方案,可能不需要此步骤。

FROM ruby:2.4-alpine
WORKDIR /usr/src/app

COPY Gemfile /usr/src/app/Gemfile
COPY Gemfile.lock /usr/src/app/Gemfile.lock

RUN bundle config build.nokogiri --use-system-libraries
RUN bundle install --without development test

VOLUME /state

COPY . /usr/src/app/
RUN chmod 755 api-entrypoint.sh

ENTRYPOINT ["/usr/src/app/api-entrypoint.sh"]
CMD ["foreman", "start"]
lxkprmvk

lxkprmvk4#

问题的另一个来源可能是你的shebang,如果你有/bin/bash,而你的映像/基本映像中没有bash,它会告诉你你的入口点没有找到,这是我遇到的问题之一。

oewdyzsn

oewdyzsn5#

在我的例子中,我有一个错误:

> [27/35] RUN /entrypoint.sh:
#31 0.503 /bin/sh: 1: /entrypoint.sh: not found

我只是运行dos2unix命令和问题消失:

dos2unix entrypoint.sh
brtdzjyr

brtdzjyr6#

我有一个golang应用程序的多阶段构建,在这个阶段出现了这个问题。golang可执行文件是在builder阶段(alpine镜像)构建的,然后复制到下一个阶段(debian镜像)。在第二个阶段出现了这个错误:'mygoexecutable' not found or does not exist.
原因是可执行文件与第二阶段的映像不兼容,因为一些cgo引用只在构建器阶段可用。Afaik apline使用libc,debian映像使用glibc。解决方案是使用兼容的映像或在构建可执行文件时设置环境变量CGO_ENABLED=0(禁用cgo)。

atmip9wb

atmip9wb7#

在我的情况下,我确实尝试首先从Dockerfile中删除EXEC命令,以检查.sh入口文件是否存在,并确认它在那里。
当我尝试从Docker容器内部运行.sh时,它显示.sh文件不存在。因此,我尝试使用sh /path_to_entrypoint/your_sh_file.sh命令运行.sh文件,它显示.sh文件中存在错误。
经过一番研究,我找到了答案,为什么有一个错误的这篇文章:https://stackoverflow.com/a/67836849/10835742

lrpiutwd

lrpiutwd8#

如果你在ENTRYPOINT中使用了一个变量,它可能不会被解析。

ENTRYPOINT ["$WORKING_DIR/start.sh"]

这将不会执行变量替换。

ENTRYPOINT ["sh", "-c", "$WORKING_DIR/start.sh"]

相关问题