簡體   English   中英

使用別名在容器內運行 bash 命令

[英]Run bash commands inside container with alias

我們有 docker contianers,我想通過腳本在我的容器中運行 bash 命令。 像這樣:

bin/run-in-container ls -la

容器中運行的腳本看起來像這樣:

#!/usr/bin/env bash

docker compose exec container_name bash -ic "$@"

我無法讓我的腳本解釋單引號內的所有參數。

這解釋為 docker compose exec api bash -ic ls -la
但我想解釋的是 docker compose exec api bash -ic 'ls -la'

如果我嘗試連接一串單引號和我的參數,它會使字符轉義:

#!/usr/bin/env bash

escaped_single_qoute="'"
docker compose exec container_name bash -ic $escaped_single_qoute "$@" $escaped_single_qoute

但這解釋為:

docker compose exec api bash -ic ''\''ls' '-la'\'''

這是一個 MCVE: 帶有 Dockerfile 和代碼的要點

services:
  node:
    restart: unless-stopped
    image: 888aaen/bash_stackoverflow:latest 

    volumes:
      # Mount .bash_aliases file.
      - "./.bash_aliases:/home/node/.bash_aliases"

腳本

#!/usr/bin/env bash

docker compose exec node bash -ic "$@"

更新:未解決

KamilCuk提供了一個很好的解決方案,但這不能在 contianer 內使用別名運行。

docker compose exec container_name bash -ic '"$@"' _ "$@"
# usage example: ./script ls -la
# usage example: ./script sh -c "ls -la ; echo another command"

假設我們有這些別名:

# ~/.bash_aliases
alias ll='ls -l'
alias la='ls -la'

我希望能夠跑步

bin/run-in-container ll
這是可能的 docker compose exec api bash -ic 'la src/'
但不與 bin/run-in-container la src/

如果要傳遞單個命令,只需傳遞命令:

docker compose exec container_name "$@"
# usage example: ./script ls -la
# usage example: ./script sh -c "ls -la ; echo another command"

如果要在 bash 交互式 shell 中運行命令時傳遞具有(奇怪?)要求的單個命令,則可以轉發參數並在 shell 中執行它們:

docker compose exec container_name bash -ic '"$@"' _ "$@"
# usage example: ./script ls -la
# usage example: ./script sh -c "ls -la ; echo another command"

如果你想傳遞一個 shell 腳本,就像 eval 一樣,只需用空格連接參數:

docker compose exec container_name bash -ic "$*"
# usage example: ./script ls -la
# usage example: ./script ls -la ';' echo another command
# usage example: ./script "$(printf "%q " sh -c "ls -la ; echo another command")"

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM