我尝试设置两个码头工人。一个有服务,一个有数据库。在有服务的docker上,我尝试从https://github.com/vishnubob/wait-for-it运行脚本wait-for-it.sh。
我尝试使用docker-compose文件来完成所有这些工作,但我将问题与容器启动时运行的.sh文件隔离开来。
FROM openjdk:8-jdk-alpine
RUN apk add --no-cache bash
COPY ./target/docker-demo-0.0.1-SNAPSHOT.jar /app.jar
COPY ./src/main/resources/wait-for-it.sh /wait-for-it.sh
ENTRYPOINT ["/wait-for-it.sh", "192.168.99.100:5432", "--", "java", "-jar",
"/app.jar"]
EXPOSE 8080
我正在使用高山图像中的清洁灰,接下来,我正在安装bash。当然,我正在改变
的第一行脚本代码#!/usr/bin/env bash
进入
#!/bin/sh
或
#!/bin/bash
没有任何帮助。我看到了这个话题How to run a bash script in an Alpine Docker container,但它也没有帮助。
我总是收到"没有这样的文件或目录"。我在弄乱
ENTRYPOINT ["/wait-for-it.sh"...
添加"。"或" ./"
我正在使用Windows 8的docker工具构建的整个项目。也许有原因?
答案 0 :(得分:2)
我有同样的问题。我花了两天时间弄清楚它为什么不起作用。我的主机是windows,所以wait-for-it.sh文件格式化为dos。
dos2unix wait-for-it.sh
命令来转换unix系统的文件。 (Convert files to unix systems) RUN apk add --no-cache bash
COPY wait-for-it.sh /wait-for-it.sh
RUN chmod +x /wait-for-it.sh
然后wait-for-it.sh在容器启动时运行。
如果您使用的是GIT,git会根据主机处理行结尾。
您必须在项目中添加文件.gitattributes
,并将此行*.sh eol=lf
添加到此文件中。
所以你要告诉你所有的.sh文件都有LF的行结尾
答案 1 :(得分:0)
COPY ./src/main/resources/wait-for-it.sh /wait-for-it.sh
这条线是罪魁祸首。如果脚本位于绝对目录
中,请使用此选项COPY /src/main/resources/wait-for-it.sh /wait-for-it.sh
如果脚本位于相对目录
中,请使用此选项COPY src/main/resources/wait-for-it.sh /wait-for-it.sh
然后运行此
RUN chmod 700 /wait-for-it.sh
答案 2 :(得分:0)
在复制声明中,尝试仅提供目标文件夹。
e.g。 COPY ./src/main/resources/wait-for-it.sh / app
还设置容器启动的工作目录
WORKDIR / app
同时确保您已为该文件提供了执行权限,如@vamsi在其答案中建议的那样。