9090 images : ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}
9191 tags : |
9292 type=raw,value=secure-latest
93+ type=raw,value=secure-{{date 'YYYYMMDD-HHmmss'}}
94+ type=sha,prefix=secure-,format=short
9395
9496 - name : Tag Docker image
9597 if : github.event.inputs.push_images != 'false'
@@ -170,6 +172,13 @@ jobs:
170172 docker images --format "table {{.Repository}}\t{{.Tag}}\t{{.Size}}" | grep ${{ env.IMAGE_NAME }}
171173 echo "Image details:"
172174 docker inspect ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:secure-latest | jq '.[0].Config'
175+
176+ # 检查镜像的基本信息
177+ echo "Image architecture: $(docker inspect --format='{{.Architecture}}' ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:secure-latest)"
178+ echo "Image OS: $(docker inspect --format='{{.Os}}' ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:secure-latest)"
179+ echo "Image created: $(docker inspect --format='{{.Created}}' ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:secure-latest)"
180+ echo "Image working dir: $(docker inspect --format='{{.Config.WorkingDir}}' ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:secure-latest)"
181+ echo "Image user: $(docker inspect --format='{{.Config.User}}' ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:secure-latest)"
173182
174183 - name : Test Docker image configuration
175184 run : |
@@ -199,24 +208,51 @@ jobs:
199208 - name : Test Python installation (inspect)
200209 run : |
201210 echo "Testing Python installation via image inspection..."
202- echo "Checking PATH environment:"
203- docker run --rm --entrypoint="" ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:secure-latest echo $PATH || echo "PATH not available"
204- echo "Searching for Python in common locations:"
205- docker run --rm --entrypoint="" ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:secure-latest find /usr -name "python*" 2>/dev/null || echo "No Python found in /usr"
206- docker run --rm --entrypoint="" ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:secure-latest find /nix -name "python*" 2>/dev/null || echo "No Python found in /nix"
207- docker run --rm --entrypoint="" ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:secure-latest find / -name "python*" -type f 2>/dev/null | head -10 || echo "No Python found anywhere"
208- echo "Checking if Python is available via direct execution:"
209- docker run --rm --entrypoint="" ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:secure-latest python --version 2>&1 || echo "python command failed"
210- docker run --rm --entrypoint="" ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:secure-latest python3 --version 2>&1 || echo "python3 command failed"
211+
212+ # 检查容器的默认命令是否能工作
213+ echo "Testing container default command:"
214+ docker run --rm ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:secure-latest 2>&1 || echo "Default command test completed"
215+
216+ # 检查环境变量
217+ echo "Checking environment variables:"
218+ docker run --rm --entrypoint="" ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:secure-latest env | grep -E "(PATH|PYTHON)" || echo "No Python environment variables found"
219+
220+ # 查找 Python 可执行文件
221+ echo "Searching for Python executables:"
222+ PYTHON_EXECS=$(docker run --rm --entrypoint="" ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:secure-latest find / -name "python*" -type f -executable 2>/dev/null | head -5)
223+ echo "Found Python executables: $PYTHON_EXECS"
224+
225+ # 测试找到的 Python 可执行文件
226+ if [ -n "$PYTHON_EXECS" ]; then
227+ for python_exec in $PYTHON_EXECS; do
228+ echo "Testing $python_exec:"
229+ docker run --rm --entrypoint="" ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:secure-latest $python_exec --version 2>&1 || echo "Failed to run $python_exec"
230+ done
231+ else
232+ echo "No Python executables found"
233+ fi
234+
211235 echo "✅ Python installation check completed"
212236
213237 - name : Test UV installation (inspect)
214238 run : |
215239 echo "Testing UV installation via image inspection..."
216- echo "Searching for UV in common locations:"
217- docker run --rm --entrypoint="" ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:secure-latest find / -name "uv" -type f 2>/dev/null || echo "No UV found"
218- echo "Checking if UV is available via direct execution:"
219- docker run --rm --entrypoint="" ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:secure-latest uv --version 2>&1 || echo "uv command failed"
240+
241+ # 查找 UV 可执行文件
242+ echo "Searching for UV executables:"
243+ UV_EXECS=$(docker run --rm --entrypoint="" ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:secure-latest find / -name "uv" -type f -executable 2>/dev/null)
244+ echo "Found UV executables: $UV_EXECS"
245+
246+ # 测试找到的 UV 可执行文件
247+ if [ -n "$UV_EXECS" ]; then
248+ for uv_exec in $UV_EXECS; do
249+ echo "Testing $uv_exec:"
250+ docker run --rm --entrypoint="" ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:secure-latest $uv_exec --version 2>&1 || echo "Failed to run $uv_exec"
251+ done
252+ else
253+ echo "No UV executables found"
254+ fi
255+
220256 echo "✅ UV installation check completed"
221257
222258 - name : Find Python executable
@@ -236,32 +272,109 @@ jobs:
236272 - name : Test package availability (inspect)
237273 run : |
238274 echo "Testing package availability via image inspection..."
239- echo "Checking if we can run the container's default command:"
240- # Try running the container without overriding entrypoint
241- docker run --rm ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:secure-latest python --version 2>&1 || echo "Default python command failed"
242275
243- echo "Checking Python package availability with found executables:"
244- # Find and test Python executables
276+ # 测试容器的默认命令
277+ echo "Testing container default command:"
278+ docker run --rm ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:secure-latest 2>&1 || echo "Default command test completed"
279+
280+ # 查找可用的 Python 可执行文件
281+ echo "Finding Python executables for package testing:"
245282 PYTHON_EXECUTABLES=$(docker run --rm --entrypoint="" ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:secure-latest find / -name "python*" -type f -executable 2>/dev/null | head -3)
283+ echo "Found Python executables: $PYTHON_EXECUTABLES"
246284
247- for python_cmd in $PYTHON_EXECUTABLES; do
248- echo "Testing packages with $python_cmd:"
249- docker run --rm --entrypoint="" ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:secure-latest $python_cmd -c "
250- try:
251- import numpy
252- print('✅ NumPy available')
253- except ImportError as e:
254- print(f'❌ NumPy not available: {e}')
285+ if [ -n "$PYTHON_EXECUTABLES" ]; then
286+ for python_cmd in $PYTHON_EXECUTABLES; do
287+ echo "Testing packages with $python_cmd:"
288+ docker run --rm --entrypoint="" ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:secure-latest $python_cmd -c "
289+ try:
290+ import numpy
291+ print('✅ NumPy available')
292+ except ImportError as e:
293+ print(f'❌ NumPy not available: {e}')
294+
295+ try:
296+ import gurobipy
297+ print('✅ Gurobi available')
298+ except ImportError as e:
299+ print(f'❌ Gurobi not available: {e}')
300+ " 2>&1 || echo "Package check failed with $python_cmd"
301+ done
302+ else
303+ echo "❌ No Python executables found for package testing"
304+ fi
305+
306+ echo "✅ Package availability check completed"
307+
308+ - name : Test Gurobi specifically
309+ run : |
310+ echo "Testing Gurobi specifically..."
311+
312+ # 检查 Gurobi 环境变量
313+ echo "Checking Gurobi environment variables:"
314+ docker run --rm --entrypoint="" ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:secure-latest env | grep -i gurobi || echo "No Gurobi environment variables found"
315+
316+ # 检查 Gurobi 安装
317+ echo "Checking Gurobi installation:"
318+ docker run --rm --entrypoint="" ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:secure-latest find / -name "*gurobi*" -type d 2>/dev/null | head -5 || echo "No Gurobi directories found"
319+
320+ # 查找可用的 Python 可执行文件
321+ echo "Finding Python executable for Gurobi test:"
322+ PYTHON_EXEC=$(docker run --rm --entrypoint="" ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:secure-latest find / -name "python*" -type f -executable 2>/dev/null | head -1)
323+
324+ if [ -n "$PYTHON_EXEC" ]; then
325+ echo "Using Python executable: $PYTHON_EXEC"
255326
327+ # 测试 Gurobi Python 包
328+ echo "Testing Gurobi Python package:"
329+ docker run --rm --entrypoint="" ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:secure-latest $PYTHON_EXEC -c "
256330 try:
257- import gurobipy
258- print('✅ Gurobi available')
331+ import gurobipy as gp
332+ print('✅ Gurobi Python package imported successfully')
333+ print(f'✅ Gurobi version: {gp.gurobi.version()}')
334+
335+ # Test basic Gurobi functionality
336+ try:
337+ model = gp.Model('test')
338+ print('✅ Gurobi model creation successful')
339+ model.dispose()
340+ except Exception as e:
341+ print(f'⚠️ Gurobi model creation failed (expected without license): {e}')
342+
259343 except ImportError as e:
260- print(f'❌ Gurobi not available: {e}')
261- " 2>&1 || echo "Package check failed with $python_cmd"
262- done
344+ print(f'❌ Gurobi Python package not available: {e}')
345+ except Exception as e:
346+ print(f'⚠️ Gurobi error: {e}')
347+ " 2>&1 || echo "Gurobi test failed"
348+ else
349+ echo "❌ No Python executable found for Gurobi test"
350+ fi
263351
264- echo "✅ Package availability check completed"
352+ echo "✅ Gurobi test completed"
353+
354+ - name : Comprehensive image validation
355+ run : |
356+ echo "Running comprehensive image validation..."
357+
358+ # 测试镜像的基本可用性
359+ echo "1. Testing basic image availability:"
360+ docker run --rm ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:secure-latest echo "✅ Image is runnable" || echo "❌ Image failed to run"
361+
362+ # 测试环境变量
363+ echo "2. Testing environment variables:"
364+ docker run --rm --entrypoint="" ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:secure-latest env | grep -E "(PYTHON|GUROBI|PATH)" || echo "No relevant environment variables found"
365+
366+ # 测试文件系统结构
367+ echo "3. Testing filesystem structure:"
368+ docker run --rm --entrypoint="" ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:secure-latest ls -la /app || echo "No /app directory"
369+ docker run --rm --entrypoint="" ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:secure-latest ls -la /home || echo "No /home directory"
370+
371+ # 测试安全配置
372+ echo "4. Testing security configuration:"
373+ echo "User: $(docker inspect --format='{{.Config.User}}' ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:secure-latest)"
374+ echo "ReadOnlyRootfs: $(docker inspect --format='{{.Config.ReadOnlyRootfs}}' ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:secure-latest)"
375+ echo "Privileged: $(docker inspect --format='{{.Config.Privileged}}' ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:secure-latest)"
376+
377+ echo "✅ Comprehensive validation completed"
265378
266379 generate-summary :
267380 runs-on : ubuntu-latest
0 commit comments