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

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

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

bash(Bourne-again-Shell)は sh(Bourne Shell)のインプリメンテーションに様々な機能が追加されたシェルです。LinuxやMac OS XではBashはデフォルトで導入されています。

SSH

SSH(Secure Shell)は、セキュアチャネルを通してデータを交換するためのネットワークプロトコルです。リモートサーバーへのコマンド実行やファイル転送を行う時に一般的に使用されます。

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

sh

shは、UNIX系OSのシェル操作の1つであり、最も基本的なシェルのことです。

Docker

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

Q&A

解決済

1回答

1065閲覧

Docker コンテナに SSH ログインした際に Dockerfile の ENV で設定した環境変数が参照できない

tiitoi

総合スコア21954

bash

bash(Bourne-again-Shell)は sh(Bourne Shell)のインプリメンテーションに様々な機能が追加されたシェルです。LinuxやMac OS XではBashはデフォルトで導入されています。

SSH

SSH(Secure Shell)は、セキュアチャネルを通してデータを交換するためのネットワークプロトコルです。リモートサーバーへのコマンド実行やファイル転送を行う時に一般的に使用されます。

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

sh

shは、UNIX系OSのシェル操作の1つであり、最も基本的なシェルのことです。

Docker

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

0グッド

0クリップ

投稿2018/11/23 06:55

編集2018/11/23 07:00

概要

Dockerfile 内で ENV コマンドで設定した環境変数は、docker run 時に起動する bash では環境変数が参照できますが、ssh ログインした際には参照できません。

以下の Dockerfile でビルドしたイメージでコンテナを作成した場合...

Dockerfile

1FROM ubuntu:16.04 2ENV LANG C.UTF-8 3 4RUN apt-get update && \ 5 apt-get install -y openssh-server && \ 6 sed -ri 's/^PermitRootLogin\s+.*/PermitRootLogin yes/' /etc/ssh/sshd_config && \ 7 echo "root:root" | chpasswd 8 9CMD service ssh start && /bin/bash

docker run で起動した場合は、ENV で設定した LANG が参照できる。

bash

1$ docker build --tag test . # ホスト側 2$ docker run -itP -p 2222:22 --rm test # ホスト側 3$ echo $LANG # コンテナ側 4C.UTF-8

ssh ログインした場合には参照できない。

bash

1$ ssh -p 2222 root@localhost # ホスト側 2# password は root 3$ echo $LANG # コンテナ側 4 5# 環境変数が参照できない

そのため、SSH ログインした際にも参照できるように Dockerfile 内で ENV で設定した環境変数は、以下のように ~/.bashrc にも記載するようにしているのですが、環境変数がたくさんあると Dockerfile が冗長になります。

Dockerfile

1FROM ubuntu:16.04 2ENV LANG C.UTF-8 3# ~/.bashrc にも書いてる。 4RUN echo 'export LANG="C.UTF-8"' >> ~/.bashrc 5 6RUN apt-get update && \ 7 apt-get install -y openssh-server && \ 8 sed -ri 's/^PermitRootLogin\s+.*/PermitRootLogin yes/' /etc/ssh/sshd_config && \ 9 echo "root:root" | chpasswd 10CMD service ssh start && /bin/bash

聞きたいこと

  • SSH ログインした場合にも環境変数を参照できるように設定する良い方法があれば、教えてください。
  • そもそも Docker コンテナに入る方法として、SSH サーバーを立ててログインする方法が bad practice なのでしょうか?(docker attach で入るべき?)

補足

  • Docker コンテナは開発環境として利用しています。(Python スクリプトを動かしたり)
  • SSH サーバーを立ててログインしている理由はコンテナとホストでファイルを転送するのが楽だからです。

自分はこうしてる等でもよいので、アドバイスがあればよろしくおねがいします。

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

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

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

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

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

guest

回答1

0

ベストアンサー

docker コンテナに sshサーバーを立てる必要は特になく、
docker execdocker cp を利用して中に入る、ファイルをコピーすると良いかと思います。

投稿2018/11/23 09:15

calkinos

総合スコア452

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

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

tiitoi

2018/11/23 15:22 編集

ご回答ありがとうございます。 docker の使い方として、ssh server を入れてログインするのではなく、docker cp など docker の機能を使ってファイルを転送するほうが一般的な使い方なのでしょうか? calkinos さんは Docker 使われるときは docker cp コマンドを使ってファイルを転送されてますか? というのもファイルをコピーするとき今は GUI の SSH クライアントでログインしてドラッグアンドドロップで転送しているのですが、docker cp の場合、複数ファイルがあるときに1つ1つ コピーしていくのが大変なので、なにかいい方法がないかなと思った次第です。
calkinos

2018/11/24 01:27

私のまわりではローカル環境でdockerを利用しているような場合にsshサーバを立てている人はまずいません。 大量に共有する必要があれば`docker run`する際にボリュームマウントして共有させてしまいますし、`docker cp`(場合によってはxargsなどを利用)で事足りています。
tiitoi

2018/11/24 12:05

実運用されてる方の意見を聞けて参考になりました。 ssh は立てないで Dockerfile を作ろうと思います。 回答ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問