linux - 针对 docker 容器执行时 Bash 脚本失败

标签 linux bash mongodb docker

我需要做的:创建一个 MongoDB 3 路副本集并使用 bash 脚本使其自动化。当我手动执行时,它工作正常,但我的脚本没有。

脚本本身:

#!/bin/bash

echo "Updating the system, this might take a couple minutes..."
sudo yum -y update

echo "Installing Docker"
curl -fsSL https://get.docker.com/ | sh

echo "Starting Services"
sudo systemctl start docker
sudo systemctl enable docker

echo "Creating Network..."
sudo docker network create mongo-cluster

echo "Creating 3 MongoDB Instances"

sudo docker run -p 30001:27017 --name primary --net mongo-cluster mongo 
mongod --replSet comments && sudo docker start primary

sudo docker run -p 30002:27017 --name failover1 --net mongo-cluster mongo 
mongod --replSet comments && sudo docker start failover1

sudo docker run -p 30003:27017 --name failover2 --net mongo-cluster mongo 
mongod --replSet comments && sudo docker start failover2

docker exec -it primary bash -c "echo 'db = (new 
Mongo(\"localhost:27017\")).getDB(\"test\")' | mongo && echo 'config = 
{\"_id\": \"comments\",\"members\": [{\"_id\": 0,\"host\": 
\"primary:27017\"},{\"_id\": 1,\"host\":\"failover1:27017\"},{\"_id\": 
2,\"host\": \"failover2:27017\"}]}' | mongo && echo 'rs.initiate(config)' | 
mongo"

echo "Completed!"

从这里我得到这个输出:

MongoDB server version: 4.0.0 2018-07-29T14:32:58.666+0000 E QUERY [js] ReferenceError: config is not defined : @(shell):1:1

这是最后一个失败的命令,因为它在那里找不到任何配置。似乎最后 3 个命令是单独执行的,因此在尝试执行最后一个命令时失败了。我尝试删除最后一个命令,脚本完美运行,但是,一旦我登录到 mongo 实例并手动运行最后一个命令,就没有任何反应。

任何帮助将不胜感激!

附言。我是新手,不要讨厌我。

最佳答案

我猜你正在尝试这样做:

echo "Creating Network..."
sudo docker network create mongo-cluster

echo "Creating 3 MongoDB Instances"

sudo docker run -d -p 30001:27017 --name primary --net mongo-cluster mongo mongod --replSet comments && sudo docker start primary

sudo docker run -d -p 30002:27017 --name failover1 --net mongo-cluster mongo mongod --replSet comments && sudo docker start failover1

sudo docker run -d -p 30003:27017 --name failover2 --net mongo-cluster mongo mongod --replSet comments && sudo docker start failover2
sleep 5 #let the quorum happens
sudo docker exec -it primary bash -c "echo 'config = {\"_id\": \"comments\",\"members\": [{\"_id\": 0,\"host\":\"primary:27017\"},{\"_id\": 1,\"host\":\"failover1:27017\"},{\"_id\":2,\"host\": \"failover2:27017\"}]};rs.initiate(config)' | mongo"

echo "Completed!"

问题:

  1. 您在与 docker run 不同的行中运行 mongod 命令
  2. 您正在运行不带 -d 的 docker run(分离模式)
  3. 您正在将配置通过管道传输到另一个 mongo shell session 并期望它在那里。我改变的是我删除了不必要的管道并将它们替换为“;”。

关于linux - 针对 docker 容器执行时 Bash 脚本失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51581439/

相关文章:

linux - makefile 没有正确导入 PATH

c++ - Linux 中的 SDL 库

c - 如何避免在 dup2 函数中关闭 newfd?

linux - 我可以在 Ubuntu 中向 Qt 应用程序添加全局快捷方式 Hook 吗?

linux - 如何在 Linux bash 中提取带条件的 csv 文件的第 n 列?

node.js - nodejs,mongodb 找不到模块 './connection/read_preference' 错误

macos - 使用简单的 bash 脚本切换 AppleShowAllFiles?

linux - 在 Linux 中将许多 CSV 文件拆分成几个更大的文件

mongodb - 限制在组聚合中推送到数组的文档

javascript - 从一个模式计算一个值并将该值放入另一个模式 mongodb Node