将 bash 命令翻译成 dockers CMD
Translate bash command to dockers CMD
我有一个在 shell 中完美运行的命令:
start-stop-daemon --quiet --oknodo --start --pidfile /run/my.pid
--background --make-pidfile --exec /opt/socat-1.7.2.4/socat PTY,link=/dev/ttyMY,echo=0,raw,unlink-close=0
TCP-LISTEN:9334,reuseaddr,fork
现在我想在启动时从 docker 容器运行这个命令。所以在 Dockerfile 的底部我有:
CMD ["bash", "start-stop-daemon", "--quiet", "--oknodo", "--start",
"--pidfile", "/run/myprocess.pid", "--background", "--make-pidfile",
"--exec", "/opt/socat-1.7.2.4/socat",
"PTY,link=/dev/ttyPROCESS,echo=0,raw,unlink-close=0",
"TCP-LISTEN:9334,reuseaddr,fork"]
但是容器退出并出现错误:
/sbin/start-stop-daemon: /sbin/start-stop-daemon: cannot execute binary file
我认为 CMD 语法有问题。有什么想法吗?
您想 bash -c <command>
而不仅仅是 bash <command>
。
将您的 CMD
更改为:
CMD ["bash", "-c", "start-stop-daemon", ...]
您不需要翻译您的命令,使用 shell form 作为 CMD 指令:CMD command param1 param2
CMD start-stop-daemon --quiet --oknodo --start --pidfile /run/my.pid --background --make-pidfile --exec /opt/socat-1.7.2.4/socat PTY,link=/dev/ttyMY,echo=0,raw,unlink-close=0 TCP-LISTEN:9334,reuseaddr,fork
通过运行 which start-stop-daemon
找出start-stop-daemon
的完整路径,然后使用:
CMD ["/full_path_to_the_bin_file/start-stop-daemon", "--quiet", "--oknodo", "--start", "--pidfile", "/run/my.pid", "--background", "--make-pidfile", "--exec", "/opt/socat-1.7.2.4/socat", "PTY,link=/dev/ttyMY,echo=0,raw,unlink-close=0", "TCP-LISTEN:9334,reuseaddr,fork"]
而不是 CMD
,您可能想使用 ENTRYPOINT
使用 supervisor 似乎是更优雅的解决方案:https://docs.docker.com/articles/using_supervisord/
[supervisord]
nodaemon=true
[program:sshd]
command=/usr/sbin/sshd -D
[program:socat]
command=/bin/bash -c socat PTY,link=/dev/ttyCUSTOM,echo=0,raw,unlink-close=0 TCP-LISTEN:%(ENV_SERIAL_PORT)s,reuseaddr,fork
我有一个在 shell 中完美运行的命令:
start-stop-daemon --quiet --oknodo --start --pidfile /run/my.pid --background --make-pidfile --exec /opt/socat-1.7.2.4/socat PTY,link=/dev/ttyMY,echo=0,raw,unlink-close=0 TCP-LISTEN:9334,reuseaddr,fork
现在我想在启动时从 docker 容器运行这个命令。所以在 Dockerfile 的底部我有:
CMD ["bash", "start-stop-daemon", "--quiet", "--oknodo", "--start", "--pidfile", "/run/myprocess.pid", "--background", "--make-pidfile", "--exec", "/opt/socat-1.7.2.4/socat", "PTY,link=/dev/ttyPROCESS,echo=0,raw,unlink-close=0", "TCP-LISTEN:9334,reuseaddr,fork"]
但是容器退出并出现错误:
/sbin/start-stop-daemon: /sbin/start-stop-daemon: cannot execute binary file
我认为 CMD 语法有问题。有什么想法吗?
您想 bash -c <command>
而不仅仅是 bash <command>
。
将您的 CMD
更改为:
CMD ["bash", "-c", "start-stop-daemon", ...]
您不需要翻译您的命令,使用 shell form 作为 CMD 指令:CMD command param1 param2
CMD start-stop-daemon --quiet --oknodo --start --pidfile /run/my.pid --background --make-pidfile --exec /opt/socat-1.7.2.4/socat PTY,link=/dev/ttyMY,echo=0,raw,unlink-close=0 TCP-LISTEN:9334,reuseaddr,fork
通过运行 which start-stop-daemon
找出start-stop-daemon
的完整路径,然后使用:
CMD ["/full_path_to_the_bin_file/start-stop-daemon", "--quiet", "--oknodo", "--start", "--pidfile", "/run/my.pid", "--background", "--make-pidfile", "--exec", "/opt/socat-1.7.2.4/socat", "PTY,link=/dev/ttyMY,echo=0,raw,unlink-close=0", "TCP-LISTEN:9334,reuseaddr,fork"]
而不是 CMD
,您可能想使用 ENTRYPOINT
使用 supervisor 似乎是更优雅的解决方案:https://docs.docker.com/articles/using_supervisord/
[supervisord]
nodaemon=true
[program:sshd]
command=/usr/sbin/sshd -D
[program:socat]
command=/bin/bash -c socat PTY,link=/dev/ttyCUSTOM,echo=0,raw,unlink-close=0 TCP-LISTEN:%(ENV_SERIAL_PORT)s,reuseaddr,fork