如何使用docker exec命令在CLI容器中运行sh脚本?

时间:2019-09-10 21:33:40

标签: bash shell docker

我想创建s sh脚本,但是在执行“ docker exec -it cli bash”时停止,并且不转到下一行。如何在root用户上运行其他命令?

root @ ee3abae377df:/opt/gopath/src/github.com/hyperledger/fabric/peer# 在这里停止,我无法执行下一个命令

docker exec -it cli bash
export CORE_PEER_MSPCONFIGPATH=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.example.com/users/Admin@org1.example.com/msp
export CORE_PEER_ADDRESS=peer0.org1.example.com:7051
export CORE_PEER_LOCALMSPID="Org1MSP"
export CORE_PEER_TLS_ROOTCERT_FILE=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/ca.crt
export CHANNEL_NAME=mychannel

3 个答案:

答案 0 :(得分:2)

docker exec -it创建一个 interactive docker容器。它会在您当前的终端中启动一个新的shell。这将阻止其余命令运行,直到您杀死或退出容器为止。实际上,一旦退出容器,剩下的命令将立即运行。

我认为这是不希望的。您应该考虑在自定义Dockerfile中为您的Docker容器创建一个entrypoint,在其中执行脚本中其余命令。

如果您以前从未创建过Dockerfile,则Docker的getting started指南是与Docker相关的所有内容的不错的介绍。

答案 1 :(得分:1)

在任何同级上使用CLI执行命令

  • 按照您的描述,cli指向 peer0.org1.example.com:7051。 (请检查您的docker-compose文件 并且会有一个容器名称为“ cli”和图像的服务 作为hyperledger / fabric-tools
  • 当您执行“ docker exec -it cli bash”时,您正在输入 放入peer0.org1的容器中。它提供了一个交互式外壳 你。

让我们考虑我们要使用cli在Pee1 Org1上安装链码,创建一个test.sh文件,并将以下cammand写入test.sh文件中

docker exec -e "CORE_PEER_LOCALMSPID=Org1MSP" -e "CORE_PEER_ADDRESS=peer1.org1.example.com:7051" -e "CORE_PEER_MSPCONFIGPATH=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.example.com/users/Admin@org1.example.com/msp" cli peer chaincode install -n cc_name -v cc_version -p cc_path

我们在这里传递环境变量CORE_PEER_ADDRESS和CORE_PEER_MSPCONFIGPATH。 然后只要执行test.sh文件,链代码将安装在peer1上,前提是容器已经在运行并且环境变量正确。 (请提供正确的链码路径,名称和版本)

答案 2 :(得分:0)

您应该利用@jeremysprofile给出的选项。但是仍然,如果您想通过Shell脚本实现它,那么您可能希望将期望脚本与Shell脚本一起编写,或者可能将两个脚本合并为一个。它应该看起来像这样:

#!/usr/bin/expect -f

expect "*root*" {

send -- "<your command>\r"
send -- "exit \r"
}

期望是根据脚本与其他交互式程序“对话”的程序。在脚本之后,期望知道程序可以期望什么,正确响应应该是什么。

Here是Linux手册页。