尝试用bash脚本自动化我的docker容器会给我一个OCI运行时错误



我正在尝试在我的容器自动化一些东西。我试着添加:

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...'

相关内容

最新更新