我已经创建了一个停靠文件
FROM alpine
RUN apk update --no-cache && apk add --no-cache --upgrade bash && apk add curl
COPY test-start.sh ./test-start.sh
RUN chmod +x ./test-start.sh
RUN sh ./test-start.sh
我已经创建了www.example.com文件test-start.sh file
#!/bin/bash
code=$(curl https://someendpoint)
if [ $code == "200" ]
then
exit 0
else
exit 1
fi
我想要做的是在创建Docker映像时执行此shell脚本,如果得到200响应,则继续构建映像,否则停止构建映像并抛出错误。现在,当我尝试构建Docker映像时,我收到了一个错误
[+] Building 10.9s (10/10) FINISHED
=> [internal] load build definition from Dockerfile.dev 0.1s
=> => transferring dockerfile: 1.18kB 0.0s
=> [internal] load .dockerignore 0.0s
=> => transferring context: 2B 0.0s
=> [internal] load metadata for docker.io/library/alpine:latest 1.9s
=> [auth] library/alpine:pull token for registry-1.docker.io 0.0s
=> [internal] load build context 0.1s
=> => transferring context: 35B 0.0s
=> CACHED [1/5] FROM docker.io/library/alpine@sha256:69665d02cb32192e52e07644d76bc6f25abeb5410edc1c7a81a10ba3f0e 0.0s
=> [2/5] RUN apk update --no-cache && apk add --no-cache --upgrade bash && apk add curl 6.0s
=> [3/5] COPY test-start.sh ./test-start.sh 0.2s
=> [4/5] RUN chmod +x ./test-start.sh 0.7s
=> ERROR [5/5] RUN sh ./test-start.sh 1.9s
------
> [5/5] RUN sh ./test-start.sh:
#10 0.790 % Total % Received % Xferd Average Speed Time Time Time Current
#10 0.790 Dload Upload Total Spent Left Speed
100 5 100 5 0 0 4 0 0:00:01 0:00:01 --:--:-- 4
: not found/test-start.sh: line 3:
#10 1.810 ./test-start.sh: line 9: syntax error: unexpected "fi" (expecting "then")
------
executor failed running [/bin/sh -c sh ./test-start.sh]: exit code: 2
我不知道错误是什么,也不知道该如何解决。
也请让我知道,如果我在这里做错了什么,因为我是新的,并学习如何做到这一点。
谢谢你!
1条答案
按热度按时间2w2cym1i1#
syntax error: unexpected "fi" (expecting "then")
看起来很奇怪。即使是没有引号的$code
也不应该导致这样的错误。请检查您的脚本是否有Windows行尾(例如使用
file test-start.sh
)。如果需要,请将文件转换为Linux行尾(例如使用dos2unix test-start.sh
)。之后,您可能会得到另一个错误,eidogg.
[: too many arguments
。如果是这样的话,请查看Cornuz的评论。变量
code
不包含http状态,但curl的stdout是http主体(例如<HTML>...</HTML>
,如果你正在查询一个网站)。然后告诉curl
使用curl -s -o /dev/null -w "%{http_code}" http://...
只输出http状态代码。顺便说一句:
if [ ... ]; then exit 0; else exit 1; fi
有点多余,你可以只使用[ ... ]
。