簡體   English   中英

Dockerfile RUN 中的環境與正在運行的容器上的交互式 shell 之間的區別?

[英]Difference between environment in Dockerfile RUN and interactive shell on a running container?

我從一個安裝了 OracleXEDocker 映像開始。 此映像有一個正在運行的實例,並配置了所有內容。
我可以啟動該圖像,並且,無論是從交互式 shell 容器,還是通過 ssh 進入容器,我都可以輕松執行sqlplus

要創建一個包含我想要添加的容器(例如新的 oracle 用戶和表空間),我可以進入正在運行的容器並執行必要的sqlplus ,然后docker commit使用我的新狀態docker commit一個新映像。 但是,我想在Dockerfile捕獲這些新更改。

但 。 .. 當我的 Dockerfile 嘗試執行與上述相同的命令時, PATH上沒有ORACLE_HOME 當我使用SSH或交互式 shell 進入容器時,它顯然會這樣做。

請注意,鏈接到上面的原始 Dockerfile 使用以下內容來設置 PATH。

RUN echo 'export ORACLE_HOME=/u01/app/oracle/product/11.2.0/xe' >> /etc/bash.bashrc
RUN echo 'export PATH=$ORACLE_HOME/bin:$PATH' >> /etc/bash.bashrc
RUN echo 'export ORACLE_SID=XE' >> /etc/bash.bashrc

執行 RUN 命令時的環境與我通過交互式 shell 或 SSH 進入容器時的環境有什么區別? 請注意,這一切都始於 ubuntu 14.04 映像。

請參閱有關啟動文件Bash 手冊條目

當您以交互方式運行時,shell 會執行其 rcfiles:

當 Bash 作為交互式登錄 shell或作為帶有 --login 選項的非交互式 shell調用時,它首先從文件 /etc/profile 讀取並執行命令(如果該文件存在)。 讀取該文件后,它會按順序查找 ~/.bash_profile、~/.bash_login 和 ~/.profile,然后從第一個存在且可讀的命令中讀取和執行命令。

當您的 Dockerfile 正在構建時,它正在運行一個非交互式 shell:

當 Bash 非交互啟動時,例如運行一個 shell 腳本,它會在環境中查找變量 BASH_ENV,如果出現就將其值擴展,並使用擴展值作為文件名來讀取和執行.

 if [ -n "$BASH_ENV" ]; then . "$BASH_ENV"; fi`

可以設置BASH_ENV以使事情運行。 或者使用RUN bash --login <command>RUN . /etc/bash.bashrc && <command> RUN . /etc/bash.bashrc && <command>在 Dockerfile 的每一行。 不過,這太惡心了。

我會使用ENV dockerfile 命令來設置這些變量。 我不知道為什么原始設置它們的方式。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM