CentOS 7 の Apache (+PHP) から、シェルを経由して sfdx コマンドを実行する
Docker に CentOS + Apache + PHP
Dockerfile を作る
CentOS インストールと PHP インストールまで自動化
FROM centos:7 RUN yum update -y && yum clean all # Repository # EPEL RUN yum install -y epel-release # remi RUN yum -y install http://rpms.famillecollet.com/enterprise/remi-release-7.rpm # installs RUN yum install -y httpd RUN yum -y install --enablerepo=remi,remi-php81 php php-devel php-mbstring php-pdo php-xml php-gd php-fpm php-mysqlnd php-opcache php-pecl-zip libzip5 EXPOSE 80 ENTRYPOINT ["/usr/sbin/httpd", "-DFOREGROUND"]
起動
コンパイルとコンテナ作成
> docker build --tag develop:1.0 . > docker run -ti --publish 8080:80 --detach --name develop develop:1.0
http://localhost:8080 で見れるはず
コンテナ番号を確認して
> docker container ls CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES bcd685553188 develop:1.0 "/usr/sbin/httpd -DF…" 2 minutes ago Up 2 minutes 0.0.0.0:8080->80/tcp develop
ログイン
> docker exec -it bcd685553188 bash [root@bcd685553188 /]#
Vim を突っ込んで、確認用画面作成
# yum install vim -y # cd /var/www/html # vim index.php
内容は
<? phpinfo(); ?>
あれ?出ない…てかHTTP応答がまんまソースやんけ
モジュールは /etc/httpd/conf.d
とか /etc/httpd/modules
に入ってるから、 httpd.conf
いじって
LoadModule php7_module modules/libphp7.so AddHandler php7-script .php DirectoryIndex index.php
コンテナ再起動して再アクセスするも変化なし…?
もしかして php.ini
か?とおもったらアタリ
short_open_tag = Off
テメーか原因は…ってことで On
で書き換えて再起動。
表示された。
PHP から sfdx コマンドコールする
nodejs インストール
この辺 からインストールコマンドを引っ張る
# curl -fsSL https://rpm.nodesource.com/setup_18.x | bash - # yum install -y nodejs
すると
Error: Package: 2:nodejs-18.13.0-1nodesource.x86_64 (nodesource) Requires: libstdc++.so.6(GLIBCXX_3.4.20)(64bit) Error: Package: 2:nodejs-18.13.0-1nodesource.x86_64 (nodesource) Requires: libc.so.6(GLIBC_2.28)(64bit) Error: Package: 2:nodejs-18.13.0-1nodesource.x86_64 (nodesource) Requires: libstdc++.so.6(CXXABI_1.3.9)(64bit) Error: Package: 2:nodejs-18.13.0-1nodesource.x86_64 (nodesource) Requires: libstdc++.so.6(GLIBCXX_3.4.21)(64bit) Error: Package: 2:nodejs-18.13.0-1nodesource.x86_64 (nodesource) Requires: libm.so.6(GLIBC_2.27)(64bit)
…さいで…
# yum install -y glibc libstdc++
でも状況変わらず…どうも要求ライブラリバージョンが合わないようで…
yum install yum install https://rpm.nodesource.com/pub_16.x/el/7/x86_64/nodejs-16.17.0-1nodesource.x86_64.rpm
しょうがないから 16 入れるか…
sfdx 入れる
悩むこたぁない…。
# npm install sfdx-cli --global # sfdx --version sfdx-cli/7.185.0 linux-x64 node-v16.17.0
インストールされる先は
# ls /usr/lib/node_modules/ corepack npm sfdx-cli
つまり直たたきができるはず
# /usr/lib/node_modules/sfdx-cli/bin/run --version sfdx-cli/7.185.0 linux-x64 node-v16.17.0
php から sfdx を呼んでみる
apache(+PHP) から exec
コマンドを実行するとき、Path とかその他諸々空っぽなので、パス設定を行うシェルコマンドを作成しておく。
NPM_PACKAGES="/usr/lib/node_modules" echo "export PATH="\""\$PATH:$NPM_PACKAGES/bin"\"" npm config set prefix $NPM_PACKAGES" | tee '/etc/profile.d/node-path.sh'
実行結果と確認。
# NPM_PACKAGES="/usr/lib/node_modules" # echo "export PATH="\""\$PATH:$NPM_PACKAGES/bin"\"" > npm config set prefix $NPM_PACKAGES" | tee '/etc/profile.d/node-path.sh' export PATH="$PATH:/usr/lib/node_modules/bin" npm config set prefix /usr/lib/node_modules # cat /etc/profile.d/node-path.sh export PATH="$PATH:/usr/lib/node_modules/bin" npm config set prefix /usr/lib/node_modules
/etc/profile.d
は非ログインシェルでも読み込まれる。
apache ユーザから呼べるようにまずは指定(権限委譲まではいらんかも知れんけど、これ専用なので一応…)
# chown apache:apache /etc/profile.d/node-path.sh # chmod +x /etc/profile.d/node-path.sh
そしたら /var/www/example.sh
を作成 ※権限は気をつけて
#!/bin/bash /etc/profile.d/node-path.sh sfdx --version exit 0
(/etc/profile.d/node-path.sh
は書かなくても読み込まれるとは思うが、一応…)
で、index.php
を下記で書き換えます。
<? $cmd = '/bin/bash /var/www/example.sh'; $output=null; $retval=null; exec($cmd, $output, $retval); echo "Returned with status $retval and output:\n"; print_r($output); ?>
そして画面アクセスすると、無事に下記が表示されました。
Returned with status 0 and output: Array ( [0] => sfdx-cli/7.185.0 linux-x64 node-v16.17.0 )