技術をかじる猫

適当に気になった技術や言語、思ったこと考えた事など。

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 )