docker-entrypoint脚本执行最佳实践

时间:2018-08-31 06:41:33

标签: bash docker docker-entrypoint

我想在我的docker-entrypoint.sh上运行几个脚本;

关于以下选项,我的问题是,它是否起作用以及是否起作用,建议的解决方法是什么?

A

${HOMEDIR}/myscript --param1 --param2

B

bash -c "${HOMEDIR}/myscript --param1 --param2"

C

source ${HOMEDIR}/myscript --param1 --param2

1 个答案:

答案 0 :(得分:1)

这实际上取决于您在做什么以及您想做什么。

${HOMEDIR}/myscript --param1 --param2

这将执行脚本。脚本完成后,对环境所做的任何更改都将被丢弃。

bash -c "${HOMEDIR}/myscript --param1 --param2"

运行bash -c "my command here"与仅运行my command here与运行bash -c的主要区别在于,前者启动一个子shell,后者运行当前shell中的命令。

但是,效果有很多差异:

  • 在子Shell中对环境所做的更改不会影响 父外壳(当前目录,环境变量的值, 函数定义等)

  • 在父外壳中设置的变量 尚未导出的子外壳将不可用。

Here是我的参考,因为我对source ${HOMEDIR}/myscript --param1 --param2 不太了解

import numpy as np
import matplotlib.pyplot as plt
import pandas as pd

#Import data

X_hist = pd.read_csv('X.csv') # predictors-total 7
y_hist = pd.read_csv('y.csv') # predictand as a rainfall 
X_pred = pd.read_csv('X_predictors.csv') # test data of predictors- 7 

#Preprocessing
X_hist.head() 
y_hist.head() 
X_pred.head() 

#converted into np arrays
X_hist1=np.array(X_hist)
y_hist1=np.array(y_hist)
X_pred1=np.array(X_pred)

#changed the variable name for my reference
X_train=X_hist1
X_test=X_pred1
y_train=y_hist1


#Feature Scaling
from sklearn.preprocessing import StandardScaler
sc_x=StandardScaler()
sc_y=StandardScaler()
x =sc_x.fit_transform(X_train)
y =sc_y.fit_transform(y_train)

# Training SVR to dataset
from sklearn.svm import SVR
regressor = SVR(kernel = 'rbf')
regressor.fit(x,y)

#Predict using Regression Model 
y_pred = sc_y.inverse_transform(regressor.predict(sc_x.transform(np.array(X_test))))

pred1=pd.DataFrame(y_pred)
pred1.to_csv("results.csv")

调用source(或其别名)时,会将脚本插入当前的bash进程中。因此,您可以读取脚本设置的变量。

调用sh时,将启动一个fork(子进程),该fork运行一个新的/ bin / sh会话,该会话通常是bash的符号链接。在这种情况下,子脚本完成时将删除由子脚本设置的环境变量。

也是here我的参考。

TL; DR:如果您不希望bash保留将要运行的脚本所需的更改,建议您使用( A )。如果要让bash保留变量和更改,请使用( C )。如果要保留更改并使bash在另一bash上运行脚本,请使用( B ),因为我列出了两者之间的差异。