個人的なメモ
検証環境でクライアントを見立てたホストを構築するのに使っている仕組みなので、セキュリティとかの考慮は一切ないです。
環境変数で設定の値だけじゃなくて、いっそのことコマンド自体を渡してしまおうという発想に至ってしまった自分を殺したい。
やり方
誰でも思いつく方法だと思うけど、単純に環境変数の中身をevalで実行するだけでいけた。
FROM centos:7.4.1708
ENV container docker
# required
# https://hub.docker.com/r/_/centos/
RUN (cd /lib/systemd/system/sysinit.target.wants/; for i in *; do [ $i == \
systemd-tmpfiles-setup.service ] || rm -f $i; done); \
rm -f /lib/systemd/system/multi-user.target.wants/*;\
rm -f /etc/systemd/system/*.wants/*;\
rm -f /lib/systemd/system/local-fs.target.wants/*; \
rm -f /lib/systemd/system/sockets.target.wants/*udev*; \
rm -f /lib/systemd/system/sockets.target.wants/*initctl*; \
rm -f /lib/systemd/system/basic.target.wants/*;\
rm -f /lib/systemd/system/anaconda.target.wants/*;
VOLUME [ "/sys/fs/cgroup" ]
RUN echo "eval \${STARTUP_RUN}" >> /etc/startup.sh
RUN echo "bash -c /etc/startup.sh" >> /etc/rc.local
RUN echo "/bin/bash">> /etc/rc.local
RUN chmod a+x /etc/rc.local
RUN chmod a+x /etc/startup.sh
CMD ["/bin/bash", "-c", "/etc/rc.local"]
環境変数で実行したいコマンドを渡してコンテナを動かす。
salacia@Vega:~/docker_env$ sudo docker run -it -d --name testhost --env STARTUP_RUN="echo 'hello' > /root/output" testimage
954f41cf05a374c00d74cd827bcd7409c150f60a1acd835824921523695404c5
環境変数で指定したコマンドが実行されたことを確認する。
salacia@Vega:~$ sudo docker exec -it testhost cat /root/output
hello
結果
すごいことになる!
追記
今回rc.localやCMDに直接記述しなかったのは、rc.localに既にいくつかの処理を記述していて、rc.localに手を入れるのは最低限にしたかったためです。
シンプルにしたいならこんな感じで(動くことは確認してない)
FROM centos:7.4.1708
RUN echo "eval \${STARTUP_RUN}" >> /etc/startup.sh
RUN chmod a+x /etc/startup.sh
CMD ["/bin/bash", "-c", "/etc/startup.sh"]
docker-compose.ymlや、DockerfileのCMDに書いても動くと思います。(未検証)