我为nodejs项目创建了一个docker conatiner,由于以下错误,docker conatiner无法运行:
/bin/sh: 1: tee /opt/app.log: not found
这是我的 Dockerfile:
FROM node:14.16.1
WORKDIR /app
COPY . /app
RUN chmod 500 /app/init.sh
CMD sh ./init.sh 2>&1 | tee /opt/app.log
你失败的原因是因为
tee /opt/app.log
由于某种原因被单个术语解释为sh
CMD。
以下 Dockerfile 使用
ENTRYPOINT
将 sh
指定为容器化引擎使用的二进制文件,然后使用其中的参数按照您想要的方式执行管道重定向:
FROM node:14.16.1
WORKDIR /app
COPY . ./
RUN chmod 500 ./init.sh
ENTRYPOINT ["sh"]
CMD ["-c", "./init.sh 2>&1 | tee /opt/app.log"]
以下是我的示例
init.sh
脚本的内容:
#!/usr/bin/env sh
echo "made it here!"
echo "example stderr" >&2
sleep infinity
我自己使用 Podman,但以下是我的示例命令的输出:
~/containerPipedCMD$ sudo podman build -t container-piped-cmd:0.0.2 .
STEP 1/6: FROM node:14.16.1
STEP 2/6: WORKDIR /app
--> Using cache ccbd8b5d1cf9bcefed05e9e4a1c5824f03f8fa1c4bd3f32e1ef6f7c603de0d7a
--> ccbd8b5d1cf
STEP 3/6: COPY . ./
--> 1bc2c5efb0c
STEP 4/6: RUN chmod 500 ./init.sh
--> 757b4540f2e
STEP 5/6: ENTRYPOINT ["sh"]
--> 77ecf538749
STEP 6/6: CMD ["-c", "./init.sh 2>&1 | tee /opt/app.log"]
COMMIT container-piped-cmd:0.0.2
--> a5025cfbebe
Successfully tagged localhost/container-piped-cmd:0.0.2
a5025cfbebe557e7c35360821850f591b45bda1ef6c92149ac6d48f0110941d7
~/containerPipedCMD$ sudo podman start container-piped-cmd
container-piped-cmd
~/containerPipedCMD$ sudo podman start container-piped-cmd
container-piped-cmd
$ sudo podman ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
e33ce19edc9d localhost/container-piped-cmd:0.0.2 -c ./init.sh 2>&1... 17 seconds ago Up 4 seconds ago container-piped-cmd
$ sudo podman logs container-piped-cmd
made it here!
example stderr
$ sudo podman exec -it container-piped-cmd cat /opt/app.log
made it here!
example stderr
但是,正如评论所建议的,最好将容器的标准输出依赖于容器化引擎。