我目前正在尝试从我的docker主机运行此命令:
docker exec container_name /bin/bash -c "touch .env; APP_KEY=$(php artisan key:generate | grep -o '\[.*]' | sed 's/[][]//g');"
问题是表达式$(表达式)将由主机评估,其中php不在路径中,就像它应该的那样。
如何告诉docker它应该使用容器shell来评估容器中的表达式?或者是否可能有另一种解决方法来实现这一目标?
答案 0 :(得分:2)
你需要引用字符串以避免扩展(单引号),这意味着你还需要转义任何嵌套的单引号和其他转义字符:
docker exec container_name /bin/bash -c \
'touch .env; APP_KEY=$(php artisan key:generate | grep -o \'\\\[.*]' | sed \'s\\/[][]//g\');'
或转义任何shell字符(如美元):
docker exec container_name /bin/bash -c \
"touch .env; APP_KEY=\$(php artisan key:generate | grep -o '\[.*]' | sed 's/[][]//g');"
答案 1 :(得分:1)
解决方案是使用单引号而不是双引号:
docker exec container_name /bin/bash -c 'touch .env; APP_KEY=$(php artisan key:generate | grep -o '\[.*]' | sed 's/[][]//g');'
在这种情况下,$表达式不会在主机命令中展开。