Shell 脚本在手动运行时有效,但在 docker 容器启动时运行时无效

问题描述 投票:0回答:1

我在 Synology NAS 上安装了 Docker。 我创建了一个运行 ubuntu 的容器,该 ubuntu 运行网站服务器。

为了启动我的服务(名为“dodoc”),我使用 npm 和 pm2。

因此,当我的容器启动时,我必须手动打开容器终端并运行以下命令:

cd /home
pm2 start dodoc
pm2 startup

然后,它就完美地工作了。

问题是我想在容器启动时自动启动该服务。通常,pm2 保存就可以了。但在 Synology NAS 上却不起作用,不知道为什么。

所以...我尝试了一种不同的方法: 在我的容器上使用 shell 脚本作为 CMD。

所以我的容器 CMD 行是:

/bin/bash -c /root/Documents/startupCommands.sh

像这样,我的容器确实在启动时运行我的脚本,但是该脚本不起作用,而如果我通过终端手动运行它,它就可以工作。

脚本(名为“startupCommands.sh”):

#!/bin/bash

cd /home && pm2 start dodoc
cd /home && pm2 startup

/bin/bash

在 NAS Synology 上,我们必须在 NAS 上设置容器可以访问的目录。 我可以放置脚本文件的目录位于容器终端的 /root/Documents 中。 但是,我的服务是在 /home 运行的。 为什么我将脚本放在不同的目录中?因为在 Synology NAS 上,您必须在创建容器时设置 CMD 行,并且之后无法修改。因此,如果您尝试运行尚不存在的 script.sh,容器将无限期地重新启动。因此,您必须将脚本文件放在您可以访问的目录中,而无需使用容器终端。

好吧...如果我在终端中手动执行以下命令,它就会起作用:

root@ubuntu-dodoc10:/home# /root/Documents/startupCommands.sh
[PM2] Spawning PM2 daemon with pm2_home=/root/.pm2
[PM2] PM2 Successfully daemonized
[PM2] Starting /home/dodoc in fork_mode (1 instance)
[PM2] Done.

但是,如果我查看容器日志,这就是启动时发生的情况:

]0;root@ubuntu-dodoc10: /homeroot@ubuntu-dodoc10:/home# 
/root/Documents/startupCommands.sh: line 4: pm2: command not found
/root/Documents/startupCommands.sh: line 5: pm2: command not found

很明显,服务器没有启动......

我已经尝试过:

  1. 安装npm是根目录
  2. 在脚本中使用 (cd /home && pm2 start dodoc) 命令
  3. 在 /home 目录中创建另一个脚本并从第一个脚本运行它

没有任何效果:'(

“Dokerfile”:

{
   "CapAdd" : null,
   "CapDrop" : null,
   "cmd" : "/bin/bash -c /root/Documents/startupCommands.sh",
   "cpu_priority" : 50,
   "enable_publish_all_ports" : false,
   "enable_restart_policy" : true,
   "enable_service_portal" : null,
   "enabled" : true,
   "env_variables" : [
      {
         "key" : "PATH",
         "value" : "/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
      }
   ],
   "exporting" : false,
   "id" : "4fc2468eaf2a84c57ddb25f1818cdef6650a792d67ac6ad7d5d69e8fd470f8c0",
   "image" : "ubuntu:latest",
   "is_ddsm" : false,
   "is_package" : false,
   "links" : [],
   "memory_limit" : 1073741824,
   "name" : "ubuntu-dodoc-test",
   "network" : [
      {
         "driver" : "host",
         "name" : "host"
      }
   ],
   "network_mode" : "host",
   "port_bindings" : [],
   "privileged" : false,
   "shortcut" : {
      "enable_shortcut" : false,
      "enable_status_page" : false,
      "enable_web_page" : false,
      "web_page_url" : ""
   },
   "use_host_network" : true,
   "volume_bindings" : [
      {
         "host_volume_file" : "/docker/dodoc",
         "mount_point" : "/root/Documents",
         "type" : "rw"
      }
   ]
}
bash docker synology
1个回答
0
投票

pm2: command not found
。这看起来很清楚。

  • 容器中是否有
    pm2
  • 它的目录在
    PATH
    吗?
  • 如果指定完整路径会发生什么?

您可以在脚本中添加一些调试语句,例如

cd /home
echo -n 'cd-ed to '
pwd
echo -n "Trying to execute pm2:"
which pm2
echo $PATH
pm2 start dodoc
pm2 startup

帮助您回答上面列表中的问题。

© www.soinside.com 2019 - 2024. All rights reserved.