Shell interaktif menggunakan Docker Compose

271

Apakah ada cara untuk memulai shell interaktif dalam wadah menggunakan Docker Compose saja? Saya sudah mencoba sesuatu seperti ini, di docker-compose.yml saya:

myapp:
  image: alpine:latest
  entrypoint: /bin/sh

Ketika saya memulai wadah ini dengan menggunakan docker-compose up, ia segera keluar. Apakah ada flag yang bisa saya tambahkan ke perintah entrypoint, atau sebagai dan opsi tambahan untuk myapp, untuk memulai sebagai shell interaktif?

Saya tahu ada opsi perintah buruh pelabuhan asli untuk mencapai ini, hanya ingin tahu apakah mungkin menggunakan Docker Compose juga.

drubb
sumber
Ini seharusnya tidak berfungsi. Misalnya, jika Anda memiliki beberapa gambar dengan /bin/shtitik masuk di file penulisan Anda, apa yang harus dilakukan?
Xiongbing Jin
2
Hmh, mengapa tidak memulai beberapa shell? Misalnya, shell ke wadah mysql untuk bekerja dengan cli mysql, dan shell ke wadah cadangan untuk menjalankan perintah cadangan?
drubb
1
bagaimana docker-compose run myapp?
ivoba
1
@ibova Masalahnya adalah dengan docker-compose run myappitu tidak akan mengekspos port. Jadi Anda harus menggunakan docker-compose run --service-ports myapptetapi tetap saja tidak nyaman.
The Fool
entrypoint: /bin/shharusentrypoint: "/bin/sh"
codentary

Jawaban:

342

Anda perlu memasukkan baris berikut di docker-compose.yml Anda:

version: "3"
services:
  app:
    image: app:1.2.3
    stdin_open: true # docker run -i
    tty: true        # docker run -t

Yang pertama sesuai dengan -idi docker rundan yang kedua ke -t.

Leon Carlo Valencia
sumber
3
itu stdin_openadalah tautan yang hilang, untuk sekadar memberi saya perilaku yang diharapkan ketika saya melampirkan ke salah satu wadah saya yang sudah menjalankan shell.
Charney Kaye
9
@TheFool, Bahkan saya punya masalah yang sama. Lebih baik dijalankandocker-compose run <service_name>
Aswath K
4
Di mana tepatnya ini ditambahkan? Di dalam layanan?
problemofficer
Ini tampaknya menjadi jawaban terbaik untuk pertanyaan OP .. karena masalahnya adalah wadah keluar segera sebaliknya, jadi menggunakan shell docker exectidak akan berhasil.
RoyM
Ini memberi saya kesalahan pada Windows:colorama\win32.py, line 152, in SetConsoleTitle: ctypes.ArgumentError: ‘ValueError’: embedded null character
cowlinator
210

Cara kanonik untuk mendapatkan shell interaktif dengan docker-compose adalah dengan menggunakan: docker-compose run --rm myapp

Anda dapat mengatur stdin_open: true, tty: true, namun itu tidak akan benar-benar memberi Anda shell yang tepat up, karena log sedang dialirkan dari semua wadah.

Anda juga bisa menggunakan

docker exec -ti <container name> /bin/bash

untuk mendapatkan shell di wadah berjalan.

dnephin
sumber
16
Catatan Anda perlu menambahkan --service-portsjika Anda mengekspos port apa pun (yaitu untuk server web)
epelc
9
Saya telah memperbarui jawaban saya untuk memberikan lebih banyak informasi dan menambahkan --rmbendera sehingga wadahnya dihapus. Jawaban oleh @ lynx0123 tidak benar. Anda tidak akan mendapatkan shell interaktif jika Anda menjalankan docker-compose up.
dnephin
2
Agar ini berfungsi menggunakan Docker untuk Windows, saya membutuhkan docker-compose v. 1.9.0 (lihat masalah Github dan PR ). Pada 12/19/16, ini hanya dikirimkan dengan Docker untuk Windows versi beta. Lalu docker-compose runbekerja. Anda juga ingin menambahkan command: /bin/bashke docker-compose.yml.
Joseph238
5
Ini harus menjadi jawaban teratas. Inilah yang saya cari ketika saya datang ke sini.
mkasberg
8
docker-compose up -d && docker attach <container_name>
Aaron McMillin
58

Pada contoh resmi untuk memulai ( https://docs.docker.com/compose/gettingstarted/ ) dengan yang berikut ini docker-compose.yml:

version: '3'
services:
  web:
    build: .
    ports:
     - "5000:5000"
  redis:
    image: "redis:alpine"

Setelah Anda mulai dengan ini docker-compose up, Anda dapat dengan mudah masuk ke rediswadah Anda atau webwadah Anda dengan:

docker-compose exec redis sh
docker-compose exec web sh 
tanah liat
sumber
44

docker-compose run myapp sh harus melakukan kesepakatan.

Ada beberapa kebingungan dengan up/ run, tetapi docker-compose rundokumen memiliki penjelasan yang bagus: https://docs.docker.com/compose/reference/run

Alex Povar
sumber
1
Terima kasih banyak. Cukup tambahkan sedikit untuk memperjelas. docker-compose run [your-service-name-defined-in-docker-compose.yml] [sh atau bash].
theeranitp
23

Menggunakan docker-compose, saya menemukan cara termudah untuk melakukan ini adalah dengan melakukan docker ps -a(setelah memulai wadah saya dengan docker-compose up) dan mendapatkan ID dari wadah saya ingin memiliki shell interaktif di (sebut saja xyz123).

Maka itu masalah sederhana untuk dieksekusi docker exec -ti xyz123 /bin/bash

dan voila, shell interaktif.

David Hersey
sumber
1
Tidak yakin mengapa ini tidak dipilih - ini adalah cara yang bagus untuk mendapatkan debugging jika terjadi kesalahan, dan saya menggunakan metode ini dengan sukses, seperti, dalam satu menit membaca solusi ini.
ericmjl
4
@ ericmjl Karena ini adalah proses dua langkah di mana pertanyaannya ditanyakan secara khusus tentang penggunaan fitur-fitur penulisan
dok
19

Jika ada orang dari masa depan juga berkeliaran di sini:

docker-compose exec container_name sh

atau

docker-compose exec container_name bash

atau Anda dapat menjalankan satu baris seperti

docker-compose exec container_name php -v

Itu setelah Anda sudah menyiapkan dan menjalankan wadah

Eleonora Ivanova
sumber
2

Anda bisa melakukannya docker-compose exec SERVICE_NAME shdi baris perintah. The SERVICE_NAMEdidefinisikan dalam Anda docker-compose.yml. Sebagai contoh,

services:
    zookeeper:
        image: wurstmeister/zookeeper
        ports:
          - "2181:2181"

Itu SERVICE_NAMEakan menjadi "penjaga kebun binatang".

Yu N.
sumber
2

Pertanyaan ini sangat menarik bagi saya karena saya mempunyai masalah, ketika saya menjalankan container setelah eksekusi selesai segera keluar dan saya perbaiki dengan -it:

docker run -it -p 3000:3000 -v /app/node_modules -v $(pwd):/app <your_container_id>

Dan ketika saya harus mengotomatiskannya dengan menulis buruh pelabuhan:

version: '3'
services:
    frontend:
        stdin_open: true
        tty: true
        build: 
            context: .
            dockerfile: Dockerfile.dev
        ports: 
            - "3000:3000"
        volumes: 
            - /app/node_modules
            - .:/app

Ini membuat trik: stdin_open: true, tty: true

Ini adalah proyek yang dibuat dengan create-react-app

Dockerfile.dev terlihat seperti ini:

FROM node:alpine

WORKDIR '/app'

COPY package.json .
RUN npm install

COPY . . 

CMD ["npm", "run", "start"]

Semoga contoh ini akan membantu orang lain untuk menjalankan frontend (bereaksi misalnya) ke dalam wadah buruh pelabuhan.

Carnaru Valentin
sumber
0

Jika ymldipanggil docker-compose.ymlitu bisa diluncurkan dengan sederhana $ docker-compose up. Lampiran terminal yang terkait dapat dengan mudah (pertimbangkan bahwa ymltelah menentukan layanan yang dipanggil myservice):

$ docker-compose exec myservice sh

Namun, jika Anda menggunakan ymlnama file yang berbeda , seperti docker-compose-mycompose.yml, itu harus diluncurkan menggunakan $ docker-compose -f docker-compose-mycompose.yml up. Untuk melampirkan terminal interaktif Anda harus menentukan ymlfile juga, seperti:

$ docker-compose -f docker-compose-mycompose.yml exec myservice sh
Cleber Jorge Amaral
sumber