使用docker exec时,评估容器内的bash表达式,而不是主机

时间:2017-11-24 20:26:21

标签: laravel docker

我目前正在尝试从我的docker主机运行此命令:

docker exec container_name /bin/bash -c "touch .env; APP_KEY=$(php artisan key:generate | grep -o '\[.*]' | sed 's/[][]//g');"

问题是表达式$(表达式)将由主机评估,其中php不在路径中,就像它应该的那样。

如何告诉docker它应该使用容器shell来评估容器中的表达式?或者是否可能有另一种解决方法来实现这一目标?

2 个答案:

答案 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');'

在这种情况下,$表达式不会在主机命令中展开。