sedを使用してDockerfileから変数を割り当て、設定ファイルの内容を置き換える方法は?

sedを使用してDockerfileから変数を割り当て、設定ファイルの内容を置き換える方法は?

実行中ですが、修正用の変数とその文字列の内容「PRIVATEIP」を割り当てると問題が発生しますDockerfile/etc/fail2ban/jail.local

Dockerfileエラーを生成して停止します。sedこれは、特定のファイルの文字列の内容を変更するために変数を割り当てる方法がわからないためです。

RUN IP=$(cat /root/ip_variable) | sed -i -r "s/PRIVATEIP/${IP}/g" /etc/fail2ban/jail.local
 ---> Running in 1e78ef4318ab

この問題を解決する他の方法がある場合はお知らせください。

================================================== =========================

2018/07/11 代替方法の説明を次のように追加しました。

Dockerfileにいくつかのコマンドラインを追加しました。目的は以前と同じです。 echo を使用して次のスクリプトを作成することもできます。ところでこれがおかしいです。 「sed」コマンドで「s」の後に付随する文字「/」が欠落しているのはなぜですか? (コード出力の文字に強調表示やマーカーを追加する方法がある場合は感謝します。) この問題が解決すれば解決できるようです。

Step 64/73 : RUN echo "#!/bin/bash\nexport PRIVATEIP=$(cat /home/ip_variable)\nsed -i -r \"s/\bPRIVATEIP\b/\${PRIVATEIP}/g\" /etc/fail2ban/jail.local\nsed -i -r \"s/\bPRIVATEIP\b/\${PRIVATEIP}/g\" /etc/opendkim/TrustedHosts" > /home/start_script.sh
 ---> Running in bbff59f82475
Removing intermediate container bbff59f82475
 ---> 0068d9d600ff
Step 65/73 : RUN cat /home/ip_variable
 ---> Running in faeb4bb1a6ba
172.17.0.2/16
Removing intermediate container faeb4bb1a6ba
 ---> f6cc35fd01e5
Step 66/73 : RUN cat /home/start_script.sh
 ---> Running in 95a5ef3b7d23
#!/bin/bash
export PRIVATEIP=172.17.0.2/16
sed -i -r "sPRIVATEI/${PRIVATEIP}/g" /etc/fail2ban/jail.local
sed -i -r "sPRIVATEI/${PRIVATEIP}/g" /etc/opendkim/TrustedHosts
Removing intermediate container 95a5ef3b7d23
 ---> 6720e7c01efc
Step 67/73 : RUN chmod 755 /home/start_script.sh
 ---> Running in d8ab5e04a846
Removing intermediate container d8ab5e04a846
 ---> decb9e147db9
Step 68/73 : RUN sh /home/start_script.sh
 ---> Running in fc86000f9a2f
sed: -e expression #1, char 28: unknown option to `s'
sed: -e expression #1, char 28: unknown option to `s'
The command '/bin/sh -c sh /home/start_script.sh' returned a non-zero code: 1

ベストアンサー1

これは私にとって効果的です。

FROM alpine

COPY ipaddr /ipaddr
COPY ipconf /ipconf
RUN export IPADDR=$(cat /ipaddr) ; sed -i -r "s/IPADDR/${IPADDR}/g" /ipconf
CMD cat /ipconf

ipconfとipaddrの使用

IP address is IPADDR

1.2.3.4

それから:

>docker build -t dynchange .
Sending build context to Docker daemon   5.12kB
Step 1/5 : FROM alpine
---> 3fd9065eaf02
Step 2/5 : COPY ipaddr /ipaddr
---> Using cache
---> 1828c3157d41
Step 3/5 : COPY ipconf /ipconf
---> 4f43e88e4425
Step 4/5 : RUN export IPADDR=$(cat /ipaddr) ;  sed -i -r "s/IPADDR/${IPADDR}/g" /ipconf
---> Running in 722c3d3d9d9e
Removing intermediate container 722c3d3d9d9e
---> 32e31198b70a
Step 5/5 : CMD cat /ipconf
---> Running in 72ea59543a7f
Removing intermediate container 72ea59543a7f
---> 73f8a50d650a
Successfully built 73f8a50d650a
Successfully tagged dynchange:latest

>docker run --rm dynchange
IP address is 1.2.3.4

しかし、それは私がしないことです。より良い方法はビルドパラメータを使用することです。

FROM alpine

COPY ipconf /ipconf
ARG IPADDR
RUN sed -i -r "s/IPADDR/${IPADDR}/g" /ipconf
CMD cat /ipconf

それから:

>docker build -t dynchange --build-arg IPADDR=4.5.6.7  .
Sending build context to Docker daemon   5.12kB
Step 1/5 : FROM alpine
---> 3fd9065eaf02
Step 2/5 : COPY ipconf /ipconf
---> Using cache
---> f5ac88ee48d5
Step 3/5 : ARG IPADDR
---> Running in 58d972e14660
Removing intermediate container 58d972e14660
---> fc3de48160c6
Step 4/5 : RUN sed -i -r "s/IPADDR/${IPADDR}/g" /ipconf
---> Running in 8ec855697510
Removing intermediate container 8ec855697510
---> 67e946559316
Step 5/5 : CMD cat /ipconf
---> Running in a5260c593c02
Removing intermediate container a5260c593c02
---> 567a31a517d1
Successfully built 567a31a517d1
Successfully tagged dynchange:latest

>docker run --rm dynchange
IP address is 4.5.6.7

しかし、これが正しい解決策であるかどうかはわかりません。私はできます:

  • コンテナの外に構成ファイルをビルドし、 を使用すると、COPYその内容を完全に制御できます。
  • コンテナが実行されている場合(環境変数またはその他)、そのIPアドレスをパラメータとして渡し、複数の環境で使用できるコンテナイメージがあります。あるいは、基本コマンドを呼び出す前にファイルをパッチするスクリプトでもCMDあります。ENTRYPOINT設定ファイルをVOLUMEに渡すこともできます。これにより、CMDがアプリケーションユーザーとして実行され、構成パッチにroot権限が必要な場合に問題が回避されます。

おすすめ記事