我正在尝试在我的容器自动化一些东西。我试着添加:
RUN curl -sS https://getcomposer.org/installer | php --install-dir=/usr/local/bin --filename=composer
composer install --no-dev
进入我的Dockerfile,但它似乎从来没有工作,所以我试着做一个sh
脚本:
docker-compose up -d --force-recreate --build
docker exec -it -u root $(docker ps --format '{{ .Names }}'|grep php) "curl -sS https://getcomposer.org/installer | php --install-dir=/usr/local/bin --filename=composer"
但是,我得到这个错误:
OCI runtime exec failed: exec failed: container_linux.go:380: starting container process caused: exec: "curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer": stat curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer: no such file or directory: unknown
如果我尝试:
docker exec -u root $(docker ps --format '{{ .Names }}'|grep php) ls
可以正常工作,如果我:
docker exec -it -u root $(docker ps --format '{{ .Names }}'|grep php) /bin/bash
curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer
It works fine…
关于为什么会发生这种情况以及如何实现这一目标,有什么想法吗?
我已经尝试将其更改为"/bin/bash -c 'curl .....'"
,但同样的错误。
完整文件(我最初有$(docker ps ...)
作为一个变量$container
,但我认为这是问题,所以复制+粘贴它):
#!/bin/bash
echo "[+] Fetching remote files..."
cd src
git reset --hard origin/master
cd ..
echo "[+] Rebuilding containers..."
docker-compose up -d --force-recreate --build
echo "[i] Got $(docker ps --format '{{ .Names }}'|grep php) After Rebuild..."
echo "[+] Installing Dependencies Via Composer..."
docker exec -u root $(docker ps --format '{{ .Names }}'|grep php) "/bin/bash -c 'curl -sS https://getcomposer.org/installer | php --install-dir=/usr/local/bin --filename=composer'"
docker exec -u root $(docker ps --format '{{ .Names }}'|grep php) "/bin/bash -c 'composer install --no-dev'"
echo "[+] Installing NPM/NodeJS Via NVM..."
docker exec -u root $(docker ps --format '{{ .Names }}'|grep php) "/bin/bash -c 'curl -sL https://raw.githubusercontent.com/creationix/nvm/v0.35.3/install.sh|bash && source ~/.profile && nvm install 12.18.3'"
echo "[+] Migrating And Running NPM Tasks..."
docker exec -u root $(docker ps --format '{{ .Names }}'|grep php) "/bin/bash -c 'php artisan migrate --force && npm run dev'"
echo "[+] Cleaning Config And Permissions..."
docker exec -u root $(docker ps --format '{{ .Names }}'|grep php) "/bin/bash -c 'php artisan config:clear && chown -R nginx:nginx .'"
echo "[+] Finished...."
乍一看,问题的关键只是"引用"的问题。
更准确地说,你的第一次尝试
docker exec -it -u root $(docker ps --format '{{ .Names }}'|grep php) "curl -sS https://getcomposer.org/installer | php --install-dir=/usr/local/bin --filename=composer"
不能工作,因为整个命令字符串在这里作为单个参数传递…而第一个参数应该只是要执行的程序二进制。
换句话说,就好像我们在shell中运行:
$ "echo ok"
→ bash: echo ok: command not found
,
docker exec -it -u root $(docker ps --format '{{ .Names }}'|grep php) "/bin/bash -c 'curl -sS https://getcomposer.org/installer | php --install-dir=/usr/local/bin --filename=composer'"
也不能工作,但后一个想法是好的!
更准确地说,您可能想要尝试docker exec -it -u root $(docker ps --format '{{ .Names }}'|grep php) /bin/bash -c 'curl -sS https://getcomposer.org/installer | php --install-dir=/usr/local/bin --filename=composer'
(没有周围的双引号),这意味着它运行/bin/bash
程序,-c
作为第一个参数,curl …
作为第二个参数。
作为题外话
由于您的目标是编写一个脚本,以便在由docker-compose
启动的同一个容器中运行多个命令,因此您可能需要:
- 排除脚本中出现
$(docker ps --format '{{ .Names }}'|grep php)
的因素,例如:container=$(docker ps --format '{{ .Names }}'|grep php) # assuming you get only 1 container name in this string (to be checked, maybe) echo "[i] Got $container After Rebuild..." docker exec -u root "$container" /bin/bash -c 'command...'
- 或者,相反,依赖于
docker-compose.yml
中指定的服务名称,并且只使用docker-compose exec
而不是docker exec
?
我的意思是,假设docker-compose.yml
看起来像
您可以在脚本中使用以下措辞:services: backend1: build: . ...
docker-compose exec backend1 /bin/bash -c 'command...'