Dockerコンテナを作成し、その中ですぐにコマンドを実行するには?

Dockerコンテナを作成し、その中ですぐにコマンドを実行するには?

新しく作成されたDockerコンテナでコマンドを自動的に実行する方法が見つかりませんでした。私はしばしば、追加パッケージの利点を利用し、ソフトウェアをインストールする前に更新する必要がある使い捨てコンテナ(以下の例ではテスト環境)を作成します。

私は対話型セッションで直接コマンドを実行することを好みます。

docker run --interactive --tty --rm fedora bash
docker run --interactive --tty --rm ubuntu bash

apt update && apt upgrade -y現在は、コマンド(および含むdnf update -y)をコンテナシェルに貼り付け続けています。

答え1

これを達成する1つの方法は、少なくとも「一時」コンテナの場合は、コマンドをsleep設定してからコンテナで実行し続け、実行中のコンテナでシェルを実行することです。

docker exec -it $(docker run -d --rm debian:unstable bash -c "apt-get update && apt-get upgrade -y && sleep 86400") bash

この方法の1つの不便な点は、更新/アップグレードが完了する前に対話型シェルが開始されることです。apt-getまた、コンテナに端末を接続しないと(別ウィンドウで)、出力は表示されません。

コマンドをインストールした後、対話型シェルを実行することもできます。

docker run -it --rm debian:unstable bash -c "apt-get update && apt-get upgrade -y && bash"

答え2

Stephen Kittの答え(まだこれを行う必要があります)のバリエーションとして、bash -c bashinitコマンドをファイルに入れ、ファイルをコンテナのどこかにマウントして、そのBASH_ENV場所に設定できます。

たとえば、次のような場合があるとします。

% cat ~/my/docker_init.sh
#! /bin/bash
if command -v apt &> /dev/null ;
then
    apt-get update && apt-get upgrade -y
elif command -v yum &> /dev/null ;
then
    yum update -y
fi

それから:

% docker run --rm -it -v ~/my:/my -e BASH_ENV=/my/docker_init.sh ubuntu:22.04 bash -c bash
Get:1 http://ports.ubuntu.com/ubuntu-ports jammy InRelease [270 kB]
Get:2 http://ports.ubuntu.com/ubuntu-ports jammy-updates InRelease [119 kB]
Get:3 http://ports.ubuntu.com/ubuntu-ports jammy-backports InRelease [108 kB]
Get:4 http://ports.ubuntu.com/ubuntu-ports jammy-security InRelease [110 kB]
Get:5 http://ports.ubuntu.com/ubuntu-ports jammy/main arm64 Packages [1758 kB]
Get:6 http://ports.ubuntu.com/ubuntu-ports jammy/universe arm64 Packages [17.2 MB]
Get:7 http://ports.ubuntu.com/ubuntu-ports jammy/multiverse arm64 Packages [224 kB]
Get:8 http://ports.ubuntu.com/ubuntu-ports jammy/restricted arm64 Packages [24.2 kB]
Get:9 http://ports.ubuntu.com/ubuntu-ports jammy-updates/multiverse arm64 Packages [27.5 kB]
Get:10 http://ports.ubuntu.com/ubuntu-ports jammy-updates/main arm64 Packages [922 kB]
Get:11 http://ports.ubuntu.com/ubuntu-ports jammy-updates/restricted arm64 Packages [441 kB]
Get:12 http://ports.ubuntu.com/ubuntu-ports jammy-updates/universe arm64 Packages [1092 kB]
Get:13 http://ports.ubuntu.com/ubuntu-ports jammy-backports/universe arm64 Packages [23.6 kB]
Get:14 http://ports.ubuntu.com/ubuntu-ports jammy-backports/main arm64 Packages [49.0 kB]
Get:15 http://ports.ubuntu.com/ubuntu-ports jammy-security/universe arm64 Packages [840 kB]
Get:16 http://ports.ubuntu.com/ubuntu-ports jammy-security/restricted arm64 Packages [441 kB]
Get:17 http://ports.ubuntu.com/ubuntu-ports jammy-security/multiverse arm64 Packages [23.4 kB]
Get:18 http://ports.ubuntu.com/ubuntu-ports jammy-security/main arm64 Packages [645 kB]
Fetched 24.3 MB in 7s (3365 kB/s)
Reading package lists... Done
Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
Calculating upgrade... Done
The following packages will be upgraded:
  libcap2
1 upgraded, 0 newly installed, 0 to remove and 0 not upgraded.
Need to get 18.1 kB of archives.
After this operation, 0 B of additional disk space will be used.
Get:1 http://ports.ubuntu.com/ubuntu-ports jammy-updates/main arm64 libcap2 arm64 1:2.44-1ubuntu0.22.04.1 [18.1 kB]
Fetched 18.1 kB in 1s (28.1 kB/s)
debconf: delaying package configuration, since apt-utils is not installed
(Reading database ... 4389 files and directories currently installed.)
Preparing to unpack .../libcap2_1%3a2.44-1ubuntu0.22.04.1_arm64.deb ...
Unpacking libcap2:arm64 (1:2.44-1ubuntu0.22.04.1) over (1:2.44-1build3) ...
Setting up libcap2:arm64 (1:2.44-1ubuntu0.22.04.1) ...
Processing triggers for libc-bin (2.35-0ubuntu3.1) ...
root@6b238d51b83f:/#

bashあるいは、スクリプトの最後のコマンドとして入れて実行することもできますbash -c exit

関連情報