PowerShell / PowerShell/PowerShell-Docker

Add `entrypoint` routing, which supports routing string-based commands to different executables, with special logic for `pwsh`

Đang mở
#398 13 bình luận 0 reaction 1 người được giao Xem trên GitHub

@TravisEz13 đang làm issue này rồi.

Từ ngày 27/3/2020.

Breaking Change Committee-Reviewed Issue-Enhancement
Ngôn ngữ chính
Dockerfile
Star
449
Fork
158
Merge trung bình
3 ngày 10 giờ
Pull request đã merge (30 ngày)
1

Mô tả

Goal

Add entrypoint routing, which supports routing string-based commands to different executables, with special logic for pwsh. In order to:

  • Provide actionable error messages. Users should know that the entrypoint syntax they used failed in PowerShell, in Bash (or other shell), or in the script itself.
  • Support on Linux and Windows (a number of these appear like general concerns, not Linux-specific).
  • This avoids needing to
    • use the --entrypoint syntax to specify an executable, and
    • split the entrypoint (an argument to docker run) from its arguments (arguments to the container; they show up last).

Background

The best practice in docker is for an image to run the product in contains.
https://docs.docker.com/develop/develop-images/dockerfile_best-practices/#entrypoint

Currently our images only run PowerShell when no command is specified. This is specified in the CMD entry in the Dockerfile.

Unfortunately, making the change causes a breaking change to the image in what is hopefully a corner case.

Customer requests for this are in #274 and #394

Proof of concept is here: https://github.com/PowerShell/PowerShell-Docker/pull/399

Other Language images
  • Work similar to the proposal
    • php
    • node
  • Like our current image
    • perl (perldebug)
    • python
  • Dumps you in bash
    • golang

Proposal

  1. Add a shell script that will detect if you are running pwsh (or similar), if so, send it to bash, otherwise run pwsh -nologo -l -c "$@"
  2. set that script as the ENTRYPOINT
  3. SetCMD to [ "pwsh" ]
  • Maintain the most features
  • Achieves the goals of the best practices
New Scenario

Note the lack of pwsh -c.

docker  run --rm  mcr.microsoft.com/powershell:7.1.0-preview.1-ubuntu-18.04 '$psversiontable.PSVersion.ToString()'
Will continue to work
docker  run --rm  mcr.microsoft.com/powershell:7.1.0-preview.1-ubuntu-18.04 pwsh -c '$psversiontable.PSVersion.ToString()'

Breaking change

Scenario - Running PowerShell using container
Working command with current images
docker  run --rm  mcr.microsoft.com/powershell:7.1.0-preview.1-ubuntu-18.04 /opt/microsoft/powershell/7-preview/pwsh -c '$psversiontable.PSVersion.ToString()'
Scenario - Expected result (with current image)
7.1.0-preview.1
Actual result (with private build with change)
ParserError: 
Line |
   1 |  7.1.0-preview.1
     |       ~~~~~~~~
     | Unexpected token '-preview' in expression or statement.
Workaround

Use --% to prevent the new PowerShell entrypoint from parsing the command.

docker  run --rm  mcr.microsoft.com/powershell:7.1.0-preview.1-ubuntu-18.04 /opt/microsoft/powershell/7-preview/pwsh --% -c '$psversiontable.PSVersion.ToString()'
Entry point script - Ubuntu
#!/bin/sh
set -e

# first arg is `pwsh` or similar
if ! { [ $1 = 'pwsh' ] || [ $1 = 'pwsh-preview' ]; }; then
 set -- pwsh -nologo -l -c "$@"
fi

exec "$@"

Hướng dẫn đóng góp

Mở hướng dẫn đóng góp

Bắt đầu từ đâu

  1. Đọc hết issue, rồi đọc hướng dẫn đóng góp của dự án.
  2. Bình luận trên issue rằng bạn sẽ nhận — tránh hai người làm cùng một việc.
  3. Fork repository và làm thay đổi trên một nhánh.
  4. Mở pull request có tham chiếu số hiệu của issue.

Đánh giá

Issue này chưa được đánh giá.

Nhận issue mới trong hộp thư của bạn

Bản tóm tắt ngắn những issue GitHub phù hợp với người mới.