2016-06-25 24 views
9

Làm cách nào để có thể tự động chạy /etc/profile khi khởi động bộ chứa Vùng chứa Alpine Docker? Tôi đã thêm một số bí danh vào tệp aliases.sh và đặt nó trong /etc/profile.d, nhưng khi tôi bắt đầu vùng chứa bằng cách sử dụng docker run -it [my_container] sh, bí danh của tôi không hoạt động. Tôi phải tự gõ . /etc/profile từ dòng lệnh mỗi lần.Làm cách nào để lấy/etc/profile để chạy tự động trong Alpine/Docker

Có một số cấu hình khác cần thiết để có được /etc/profile để chạy khi đăng nhập không? Tôi cũng gặp sự cố khi sử dụng tệp ~/.profile. Bất kỳ cái nhìn sâu sắc được đánh giá cao!

EDIT:

Dựa trên câu trả lời VonC, tôi kéo và chạy ví dụ mình ruby container. Đây là những gì tôi nhận:

$ docker run --rm --name ruby -it codeclimate/alpine-ruby:b42 
/# more /etc/profile.d/rubygems.sh 
export PATH=$PATH:/usr/lib/ruby/gems/2.0.0/bin 
/# env 
no_proxy=*.local, 169.254/16 
HOSTNAME=6c7e93ebc5a1 
SHLVL=1 
HOME=/root 
TERM=xterm 
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin 
PWD=/ 
/# exit 

Mặc dù tập tin /etc/profile.d/rubygems.sh tồn tại, nó không phải đang được chạy khi tôi đăng nhập và biến môi trường PATH của tôi không được cập nhật. Tôi có đang sử dụng sai lệnh docker run không? Có cái gì khác mất tích? Có ai nhận được ~/.profile hoặc /etc/profile.d/ tệp để làm việc với Alpine trên Docker không? Cảm ơn!

+0

Bạn hãy thử xây dựng hình ảnh Alpine với 'ADD .profile/etc/.profile'? –

+2

Không, tôi chưa bao giờ thực sự nghe nói về cố gắng sử dụng '/ etc/.profile'. Tôi luôn tin rằng '.profile' nằm trong thư mục' HOME' của bạn, trong khi 'profile' (không có dấu chấm) thuộc về'/etc'. –

Trả lời

7

Bạn vẫn có thể cố gắng trong Dockerfile bạn a:

RUN echo '\ 
     . /etc/profile ; \ 
    ' >> /root/.profile 

(. Giả sử người dùng hiện nay là root Nếu không, thay thế /root với đường dẫn về nhà đầy đủ)

Điều đó đang được nói, những/etc /profile.d/xx.sh sẽ chạy.
Xem codeclimate/docker-alpine-ruby làm ví dụ:

COPY files/

Với 'files/etc "bao gồm một files/etc/profile.d/rubygems.sh chạy tốt


Trong OP projectDockerfile, có một

COPY aliases.sh /etc/profile.d/ 

Nhưng. vỏ mặc định là không phải vỏ đăng nhập (sh -l), có nghĩa là profile files (or those in /etc/profile.d) are not sourced.

Thêm sh -l sẽ làm việc: vỏ

[email protected]:~$ docker run --rm --name ruby -it codeclimate/alpine-ruby:b42 sh -l 
87a58e26b744:/# echo $PATH 
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/lib/ruby/gems/2.0.0/bin 
+0

VonC: Tôi cũng đã thử sử dụng tệp '/ root/.profile', với cùng các định nghĩa bí danh mà tôi đang đưa vào tệp'/etc/profile.d/aliases.sh'. Thật ra, đó là điều đầu tiên tôi thử. Tôi nghĩ có lẽ có thứ gì đó khác biệt với 'ash' và 'sh' trên Alpine mà tôi đã bỏ lỡ - một số lý do khiến' .profile' của tôi không được đọc. Tôi sẽ xem xét ví dụ của bạn. Cảm ơn! –

+0

Nhân tiện, đây là vùng chứa 'Node' cơ bản, nơi tôi đang sử dụng tệp' aliases.sh'. Có thể ai đó có thể kéo vùng chứa này và xem liệu bí danh và lời nhắc màu có đang hoạt động chính xác khi họ đăng nhập không ... 'https: // hub.docker.com/r/jkilbride/nút-npm-alpine /' –

+0

@JeffKilbride Tôi có đã chỉnh sửa câu trả lời của tôi. Có lẽ một chmod bị thiếu? – VonC

9

Giá trị mặc định trong Alpine Linux là ash.

Ash sẽ chỉ đọc các tệp /etc/profile~/.profile nếu nó được bắt đầu làm vỏ đăng nhập sh -l.

Để buộc Ash mã nguồn /etc/profile hoặc bất kỳ tập lệnh nào khác mà bạn muốn khi gọi là shell không đăng nhập, bạn cần thiết lập biến môi trường có tên là ENV trước khi khởi chạy Ash.

ví dụ:trong Dockerfile bạn

FROM alpine:3.5 

ENV ENV="/root/.ashrc" 

RUN echo "echo 'Hello, world!'" > "$ENV" 

Khi bạn xây dựng mà bạn nhận được:

[email protected]:~/blah$ docker build --tag test . 
Sending build context to Docker daemon 2.048kB 
Step 1/3 : FROM alpine:3.5 
3.5: Pulling from library/alpine 
627beaf3eaaf: Pull complete 
Digest: sha256:58e1a1bb75db1b5a24a462dd5e2915277ea06438c3f105138f97eb53149673c4 
Status: Downloaded newer image for alpine:3.5 
---> 4a415e366388 
Step 2/3 : ENV ENV "/root/.ashrc" 
---> Running in a9b6ff7303c2 
---> 8d4af0b7839d 
Removing intermediate container a9b6ff7303c2 
Step 3/3 : RUN echo "echo 'Hello, world!'" > "$ENV" 
---> Running in 57c2fd3353f3 
---> 2cee6e034546 
Removing intermediate container 57c2fd3353f3 
Successfully built 2cee6e034546 

Cuối cùng, khi bạn chạy container mới được tạo ra, bạn nhận được:

[email protected]:~/blah$ docker run -ti test /bin/sh 
Hello, world! 
/# exit 

Chú ý vỏ Ash didn' t chạy như một vỏ đăng nhập.

Vì vậy, để trả lời câu hỏi của bạn, thay thế

ENV ENV="/root/.ashrc" 

với:

ENV ENV="/etc/profile" 

và Ash vỏ Alpine Linux sẽ tự động tìm nguồn/etc/profile kịch bản mỗi lần vỏ được khởi chạy.

Gotcha:/etc/hồ sơ thường có nghĩa là chỉ được cung cấp một lần! Vì vậy, tôi sẽ khuyên bạn không nên nguồn và thay vào đó, hãy thay vào đó một nguồn /root/.somercfile.

Nguồn: https://stackoverflow.com/a/40538356

2

Như đã đề cập bởi Jinesh trước, vỏ mặc định trong Alpine Linux là tro

localhost:~$ echo $SHELL 
/bin/ash 
localhost:~$ 

giải pháp Do đó đơn giản là quá thêm bí danh của bạn trong .profile. Trong trường hợp này, tôi đặt tất cả các bí danh của tôi trong ~/.ash_aliases

localhost:~$ cat .profile 
# ~/.profile 

# Alias 
if [ -f ~/.ash_aliases ]; then 
    . ~/.ash_aliases 
fi 

localhost:~$ 

.ash_aliases nộp

localhost:~$ cat .ash_aliases 
alias a=alias 
alias c=clear 
alias f=file 
alias g=grep 
alias l='ls -lh' 
localhost:~$ 

Và nó hoạt động :)

Các vấn đề liên quan