docker: tập tin thực thi không tìm thấy trong $ PATH


216

Tôi có một hình ảnh docker cài đặt grunt, nhưng khi tôi cố chạy nó, tôi gặp lỗi:

Error response from daemon: Cannot start container foo_1: \
    exec: "grunt serve": executable file not found in $PATH

Nếu tôi chạy bash trong chế độ tương tác, gruntcó sẵn.

Tôi đang làm gì sai?

Đây là Dockerfile của tôi:

# https://registry.hub.docker.com/u/dockerfile/nodejs/ (builds on ubuntu:14.04)
FROM dockerfile/nodejs

MAINTAINER My Name, me@email.com

ENV HOME /home/web
WORKDIR /home/web/site

RUN useradd web -d /home/web -s /bin/bash -m

RUN npm install -g grunt-cli
RUN npm install -g bower

RUN chown -R web:web /home/web
USER web

RUN git clone https://github.com/repo/site /home/web/site

RUN npm install
RUN bower install --config.interactive=false --allow-root

ENV NODE_ENV development

# Port 9000 for server
# Port 35729 for livereload
EXPOSE 9000 35729
CMD ["grunt"]

bạn có thể thử xây dựng docker bằng cách sử dụng CMD grunt? Hoặc bạn có thể cố gắng thực hiện lệnh grunt bằng cách vượt qua đường dẫn đầy đủ?
mgaido

@ mark91 xin vui lòng bạn có thể giải thích về những gì bạn đang yêu cầu xây dựng lại bằng cách sử dụng CMD grunt?Bạn có nghĩa là bỏ [""]không?
Steve Lorimer

Chỉ cần thử nó - và nó đã làm việc - cảm ơn! Vì vậy, đối với bất kỳ ai khác đến, hãy đổi CMD ["grunt"]thànhCMD grunt
Steve Lorimer

10
Điều này là do nếu bạn CMD ["grunt"]sử dụng shell khác để thực thi lệnh, vì vậy trong shell đó $ PATH có khả năng không được đặt.
mgaido

Câu trả lời:


198

Khi bạn sử dụng định dạng exec cho một lệnh (ví dụ: CMD ["grunt"]mảng JSON có dấu ngoặc kép), nó sẽ được thực thi mà không cần shell. Điều này có nghĩa là hầu hết các biến môi trường sẽ không có mặt.

Nếu bạn chỉ định lệnh của mình là một chuỗi thông thường (ví dụ CMD grunt) thì chuỗi sau CMDsẽ được thực thi với /bin/sh -c.

Thông tin thêm về điều này có sẵn trong phần CMD của tài liệu tham khảo Dockerfile .


2
Đây là một liên kết đến phần CMD của tài liệu tham khảo docs.docker.com/engine/reference/builder/#cmd
Calvin

Xin lỗi câu hỏi ngớ ngẩn này, nhưng làm thế nào bạn có thể thực thi một lệnh linux mà không cần shell? Điều gì sẽ tương đương để làm điều này trên một máy linux (không sử dụng docker)?
wvducky

1
Để trả lời câu hỏi của riêng tôi, nó tương tự như làm sudo sethoặc (exec set). Chúng sẽ thất bại bởi vì chúng thực thi các lệnh mà không có shell (và setlà shell dựng sẵn). Tuy nhiên, sudo ls(exec ls)sẽ hoạt động vì lslà một tệp nhị phân thực tế /bin/ls.
wvducky

315

Đây là kết quả đầu tiên trên google khi tôi dán thông báo lỗi của mình và đó là do các đối số của tôi không đúng thứ tự.

Tên container phải theo sau tất cả các đối số.

Xấu:

docker run <container_name> -v $(pwd):/src -it

Tốt

docker run -v $(pwd):/src -it <container_name>

132
Nếu bạn luôn đọc kỹ tài liệu trước khi bắt đầu viết mã, bạn sẽ không bao giờ làm được gì. Khi bạn mua chiếc xe mới của mình, bạn đã đọc hướng dẫn 200 trang trước khi bạn lái nó về nhà chưa? Không. Và khi có vấn đề với chiếc xe của bạn, bạn đã google nó trước hay bạn đã đi lấy hướng dẫn chưa? Điều này là hoàn toàn hợp lý, tôi chỉ có thể tưởng tượng tất cả những người thấy nó hữu ích nhưng không nhấp vào nút upvote! Điều không hợp lý là câu trả lời hoàn toàn không liên quan này là kết quả google đầu tiên cho thông báo lỗi này hoặc rằng docker cli không trực quan và không tha thứ. Chúc mừng.
sarink

8
Trong nhiều tập lệnh, thứ tự của các cờ không quan trọng, vì vậy tôi có thể thấy tại sao điều này có thể xảy ra với bất kỳ ai. Câu trả lời khá hữu ích. Không cần phải nói rằng thông báo lỗi từ docker hoàn toàn không hữu ích.
kịch bản

9
Ồ, tôi đã phải vật lộn một lúc nếu không có câu trả lời này. Tại sao UNIX không có trình phân tích cú pháp đối số CLI tiêu chuẩn, linh hoạt và mạnh mẽ? ...
diễn ra vào

1
Đây là vấn đề đối với tôi. Đặt tên container vào cuối dường như hoạt động
Rob Segal

3
Tôi đã bị đánh lừa bởi câu trả lời được chấp nhận, muốn tự viết, nhưng dường như nó đã ở đây rồi. Vì vậy, tôi có thể xác nhận rằng điều này giải quyết được vấn đề ...
Arturas M

24

Tôi tìm thấy vấn đề tương tự. Tôi đã làm như sau:

docker run -ti devops -v /tmp:/tmp /bin/bash

Khi tôi đổi nó thành

docker run -ti -v /tmp:/tmp devops /bin/bash

nó hoạt động tốt.


1
Nó làm việc cho tôi, nhưng tôi không hiểu cách sử dụng -vở đây. -vlà để liên kết gắn kết một âm lượng (như được mô tả trong docker run --help | grep "\-v"), đối với tôi, tôi đã /tmpgắn kết trong File Sharing(cài đặt Docker), vậy tại sao tôi nên sử dụng lại nó?
Ahmad

12

Có một số lý do có thể cho một lỗi như thế này.

Trong trường hợp của tôi, đó là do tệp thực thi ( docker-entrypoint.shtừ blog Ghost Dockerfile ) thiếu chế độ tệp thực thi sau khi tôi tải xuống.

Giải pháp: chmod +x docker-entrypoint.sh


Đây là nhận xét chỉ cho tôi câu trả lời đúng. Tôi đã phải SAO CHÉP các tập tin và sau đó chmod nó.
beyondtheteal

7

Một container Docker có thể được xây dựng mà không có vỏ (ví dụ: https://github.com/fluent/fluent-bit-docker-image/issues/19 ).

Trong trường hợp này, bạn có thể sao chép trong một trình biên dịch tĩnh và thực thi nó, vd

docker create --name temp-busybox busybox:1.31.0
docker cp temp-busybox:/bin/busybox busybox
docker cp busybox mycontainerid:/busybox
docker exec -it mycontainerid /bin/busybox sh

4

Vì một số lý do, tôi nhận được lỗi đó trừ khi tôi thêm trình làm rõ "bash". Ngay cả việc thêm "#! / Bin / bash" vào đầu tệp nhập cảnh của tôi cũng không giúp được gì.

ENTRYPOINT [ "bash", "entrypoint.sh" ]

@SteveLorimer, vâng. Tôi đã làm một COPYvà sau đó RUN chmod +x /compile_nibbler.shtrước cuộc gọi điểm vào.
beyondtheteal

1

Tôi đã có cùng một vấn đề, Sau rất nhiều lần, tôi không thể tìm ra cách khắc phục.

Đột nhiên tôi nhận thấy sai lầm ngu ngốc của mình :)

Như đã đề cập trong các tài liệu , phần cuối cùng củadocker run là lệnh bạn muốn chạy và các đối số của nó sau khi tải lên container.

KHÔNG PHẢI LÀ TÊN CONTAINER !!!

Đó là sai lầm đáng xấu hổ của tôi.

Dưới đây tôi cung cấp cho bạn hình ảnh của dòng lệnh của tôi để xem những gì tôi đã làm sai.

Và đây là bản sửa lỗi như được đề cập trong các tài liệu .

nhập mô tả hình ảnh ở đây


-7

để làm cho nó hoạt động thêm tham chiếu mềm vào / usr / bin:

ln -s $ (nút nào) / usr / bin / nút

ln -s $ (mà npm) / usr / bin / npm


1
Vui lòng thêm mô tả về cách nó sẽ giúp anh ta.
Mathews Nắng
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.