새로 생성된 Docker 컨테이너에서 명령을 자동으로 실행하는 방법을 찾지 못했습니다. 저는 종종 추가 패키지의 이점을 활용하고 소프트웨어를 설치하기 전에 업데이트해야 할 수 있는 일회용 컨테이너(아래 예에서는 테스트 환경으로)를 만듭니다.
나는 대화형 세션에서 직접 명령을 실행하는 것을 선호합니다.
docker run --interactive --tty --rm fedora bash
docker run --interactive --tty --rm ubuntu bash
apt update && apt upgrade -y
현재는 명령( 및 포함 dnf update -y
)을 컨테이너 셸에 계속 붙여넣고 있습니다 .
답변1
이를 달성하는 한 가지 방법은 적어도 "임시" 컨테이너의 경우 sleep
명령을 설정한 후 컨테이너에서 계속 실행한 다음 실행 중인 컨테이너에서 셸을 실행하는 것입니다.
docker exec -it $(docker run -d --rm debian:unstable bash -c "apt-get update && apt-get upgrade -y && sleep 86400") bash
이 방법의 한 가지 불편한 점은 업데이트/업그레이드가 완료되기 전에 대화형 셸이 시작된다는 것입니다. apt-get
또한 컨테이너에 터미널을 연결하지 않으면(다른 창에서) 출력을 볼 수 없습니다.
명령을 설치한 후 대화형 셸을 실행할 수도 있습니다.
docker run -it --rm debian:unstable bash -c "apt-get update && apt-get upgrade -y && bash"
답변2
Stephen Kitt의 답변(여전히 이 작업을 수행해야 함)의 변형으로 bash -c bash
init 명령을 파일에 넣고 파일을 컨테이너 어딘가에 마운트한 다음 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
.