質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.49%
Docker

Dockerは、Docker社が開発したオープンソースのコンテナー管理ソフトウェアの1つです

Q&A

解決済

3回答

1021閲覧

Dockerfileにて、一時的にサービスを起動したい

退会済みユーザー

退会済みユーザー

総合スコア0

Docker

Dockerは、Docker社が開発したオープンソースのコンテナー管理ソフトウェアの1つです

1グッド

0クリップ

投稿2018/03/12 04:38

編集2018/03/12 09:22

いつもお世話になっております。

Dockerfileにて、RUNでサービスを起動し、その起動したサービスに対してコマンドを実行したいと考えています。

Dockerfileでプリンターサーバーをたてて、その後、必要なプリンターの設定も行おうと思い下記のような設定をしております。

RUN set -x \ && apt-get install cups -y \ && /etc/init.d/cups start \ && /usr/sbin/lpadmin -p TEST_PRINT-m lsb/usr/CNCUPSLBP441EZJ.ppd -v socket://192.168.1.10

lpadmin が実行されるのですが、

lpadmin: Unable to connect to server: Transport endpoint is not connected

となり、サービスが起動されていないため、lpadminが正常に終了しませんでした。

一時的にでも、イメージ作成中にサービスを起動することはできないのでしょうか?

解決方法がございましたら、ご教授いただけると幸いです。
宜しくお願い致します。

tatsuya6502様から、アドバイスを頂き切り分けをしてみました。

ご回答ありがとうございます。

macvlan を利用して、ホスト上と同一ネットワークにする予定です。
lpadminで、固定のIPアドレスを指定しているのは、ルーティングで解決し印刷もできるようにするため、小生の環境では固定とさせて頂きました。

RUN set -x \ && apt-get install cups -y \

のコンテナを作成し、Google Container Repositoryにアップして、イメージ作成後、コンテナ起動して、ログインしてみました。

Dockerfile

1FROM gcr.io/xxx_xxxx/cups_test 2 3ADD . /src 4WORKDIR /src 5 6RUN set -x \ 7&& chmod 755 /src/printer-add.sh \ 8&& /usr/sbin/cupsd \ 9&& /usr/sbin/lpadmin -p TEST_PRINT-m lsb/usr/CNCUPSLBP441EZJ.ppd -v socket://192.168.1.10 10

想定では、この段階で、プリンターが追加されることを想定しています。

その後、コンテナ起動し確認しました。

docker run --privileged -d --net=mcv --ip=192.168.2.14 -v /var/docker:/var/docker --name cups_test fd242a638373 /sbin/init
docker exec -it cups_test /bin/bash

cupsのサービスの確認

1# /etc/init.d/cups status 2● cups.service - CUPS Scheduler 3Loaded: loaded (/lib/systemd/system/cups.service; enabled; vendor preset: enabled) 4Active: active (running) since Mon 2018-03-12 09:12:34 UTC; 57s ago 5Docs: man:cupsd(8) 6Main PID: 36 (cupsd) 7CGroup: /system.slice/docker-30865b31fd3db54c6dd3e7bafd41804b878227c32330d906c29ed534ef215078.scope/system.slice/cups.service 8└─36 /usr/sbin/cupsd -l 9 10Mar 12 09:12:34 30865b31fd3d systemd[1]: Started CUPS Scheduler. 11Mar 12 09:12:34 30865b31fd3d systemd[1]: Started CUPS Scheduler.

cupsのサービスは起動しております。

# ls /etc/cups/ppd/ TEST_PRINT.ppd

ppdファイルが作成されているのでできているのかと思ったのですが、GUI上の管理画面からは、プリンターが表示されていません。

念のために、再起動しても表示されませんでした。

ログイン後、コマンドラインから、

/usr/sbin/lpadmin -p TEST_PRINT-m lsb/usr/CNCUPSLBP441EZJ.ppd -v

を実行すると、GUIの管理画面からも表示されております。

miyabi-sun👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

全体的にDocker流の使い方から外れているように思えますので、
その編の擦り合わせをしないと回答出来ない部分があります。

Dockerfileでプリンターサーバーをたてて、その後、必要なプリンターの設定も行おうと思い

Dockerfileはdocker buildで全自動イメージ作成コマンドみたいなものです。
コマンドで書けないようなトリッキーな事は基本的にはNGです。

例えば別のLinuxマシンでプリンターの設定を予め作っておき、
ファイルとしてCOPYコマンドで注入するという手法を検討してみてください。

/etc/init.d/cups start

デーモン実行という使い方は出来るだけ避けてください。

Dockerはコンテナ内はフォアグラウンドで動作する設定にし、
docker runでコンテナを立ち上げる段階で
-dオプションを付与してコンテナ自体をバックグラウンドで動作させる使い方がメインです。

投稿2018/03/12 08:15

miyabi-sun

総合スコア21158

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

一時的にでも、イメージ作成中にサービスを起動することはできないのでしょうか?

cupsで試したことはありませんが、起動できるはずです。

問題切り分けのために、Dockerfileでなく、コンテナに入って手動でコマンドを実行してみることをおすすめします。docker build に失敗した時のコンテナとイメージが残っているはずですので、それを使うのが楽です。

# 停止しているものも含め、全てのコンテナをリストアップする。 $ docker ps -a # コンテナを再スタートして、attachする。 $ docker start コンテナID $ docker attach -it コンテナID /bin/bash # コンテナを再スタートできないときは、代わりに、コンテナが # 使っていたイメージを使う。 $ docker run -it イメージID /bin/bash

コンテナに入ったら /etc/init.d/cups start/etc/init.d/cups status などを実行して、サービスが起動されたか確認してください。またサービスがスタートしているのに接続できないなら、/etc/cups/cupsd.conf ファイルの内容(たとえば Listen が正しく設定されているか)を確認してください。

と、ここまで書いて気づきましたが、lpadmin で接続先の IP アドレスに 192.168.1.10 を指定されていますね。コンテナの IP アドレスは実行するたびに変わるので(しかもデフォルトは 172.17.0.x だと思います)、ローカルループバックアドレス(127.0.0.1)を使わないとダメかもしれません。

投稿2018/03/12 08:06

tatsuya6502

総合スコア2035

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2018/03/12 09:16

ご回答ありがとうございます。 macvlan を利用して、ホスト上と同一ネットワークにする予定です。 lpadminで、固定のIPアドレスを指定しているのは、ルーティングで解決し印刷もできるようにするため、小生の環境では固定とさせて頂きました。 ``` RUN set -x \ && apt-get install cups -y \ ``` のコンテナを作成し、Google Container Repositoryにアップして、イメージ作成後、コンテナ起動して、ログインしてみました。 ``` Dockerfile FROM gcr.io/xxx_xxxx/cups_test ADD . /src WORKDIR /src RUN set -x \ && chmod 755 /src/printer-add.sh \ && /usr/sbin/cupsd \ && /usr/sbin/lpadmin -p TEST_PRINT-m lsb/usr/CNCUPSLBP441EZJ.ppd -v socket://192.168.1.10 ``` ``` コンテナの起動 docker run --privileged -d --net=mcv --ip=192.168.2.14 -v /var/docker:/var/docker --name cups_test fd242a638373 /sbin/init ``` ``` コンテナにログイン docker exec -it cups_test /bin/bash ``` ``` cupsのサービスの確認 # /etc/init.d/cups status ● cups.service - CUPS Scheduler Loaded: loaded (/lib/systemd/system/cups.service; enabled; vendor preset: enabled) Active: active (running) since Mon 2018-03-12 09:12:34 UTC; 57s ago Docs: man:cupsd(8) Main PID: 36 (cupsd) CGroup: /system.slice/docker-30865b31fd3db54c6dd3e7bafd41804b878227c32330d906c29ed534ef215078.scope/system.slice/cups.service └─36 /usr/sbin/cupsd -l Mar 12 09:12:34 30865b31fd3d systemd[1]: Started CUPS Scheduler. Mar 12 09:12:34 30865b31fd3d systemd[1]: Started CUPS Scheduler. ```
tatsuya6502

2018/03/12 09:44

docker run する時には固定 IP にするんですね。ただ docker build 時は --net=mcv --ip=192.168.2.14 などの指定なしにコンテナが実行されるのでその固定 IP は使えないのではないでしょうか。 docker build でなぜ問題が出ているか切り分けるために、コンテナを docker build がするように docker run -it イメージID /bin/bash で起動して(つまり--privileged、--net=... --ip=... -v ... /sbin/init などは付けないで起動して)、Dockerfile に書かれたコマンド(/usr/sbin/cupsd、/usr/sbin/lpadmin -p TEST_PRINT-m ...)を手で実行してみてください。
退会済みユーザー

退会済みユーザー

2018/03/12 09:57

ご回答ありがとうございます。 手動で実行したところ、cupsの起動も、プリンターの追加も行うことができました。 ひとつ、見落としをしていたのですが、Dockerfileを利用した場合、/etc/cups/printers.confが作成されていないことがわかりました。 lpadmin自体は実行されているのですが、printers.confに書かれないといった現象が確認できました。 miyabi-sun様からもアドバイス頂いた用に、少しやってることが間違っているのでしょうか…。
tatsuya6502

2018/03/12 10:31

> miyabi-sun様からもアドバイス頂いた用に、少しやってることが間違っているのでしょうか…。 間違ってるとは言いませんが、docker build の際はコンテナが素の状態(例 --privileged無し)で実行されますので、Dockerfile で RUN するコマンドはできるだけ簡単にした方が、トラブルを避けられますね。 私は cups を使ったことがないのでアドバイスするのが難しいのですが、もし /usr/sbin/lpadmin を実行する理由が /cups/printers.conf を作るためだけでしたら、miyabi-sunさんのおっしゃるように、別のLinuxマシンで設定を作っておき、COPYコマンドでコンテナに入れる方法がよいと思います。
guest

0

ベストアンサー

tatsuya6502様、miyabi-sun様、ご回答ありがとうございます。

できました。

Dockerの問題ではなくて、cupsをコマンドラインから追加した場合、/etc/cups/ppdの下にファイルを作成されるのですが、これだけでは、自動的にプリンターが登録されず、 cupsを再起動することで、/etc/cups/printers.confが、作成されることがわかりました。

RUN set -x \ && chmod 755 /src/printer-add.sh \ && /etc/init.d/cups start \ && /usr/sbin/lpadmin -p TEST_PRINT-m lsb/usr/CNCUPSLBP441EZJ.ppd -v -v socket://192.168.1.100 \ && /etc/init.d/cups restart

として、解決されました。

迅速にご丁寧に回答ありがとうございました。

投稿2018/03/12 10:51

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.49%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問